This is an evolving analysis of the Electronic Surgical Discharge Dataset

Completion Analysis

Overall Completion Fraction

Patient Searching

Distribution of Common Last Names

Last Name Frequency

`geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
Quitting from lines 1563-1641 (ED_Markdown.Rmd) 

Demographic Analysis

Ethnicity

Ethnicity Percentage (%) Lower 95% CI Upper 95% CI
Asian 0.03 0.00 0.48
Black 92.30 91.85 92.76
Coloured 2.96 2.51 3.42
Indian 1.49 1.05 1.95
Other 0.16 0.00 0.62
White 3.06 2.61 3.51

Sex

Gender Percentage (%) Lower 95% CI Upper 95% CI
Female 52.81 51.84 53.77
Male 47.14 46.17 48.11
Other 0.05 0.00 1.02

Age Group

Age Group Percentage (%) Lower 95% CI Upper 95% CI
Infant 0.28 0.00 1.27
Preschool Child 0.00 0.00 0.99
Child 1.48 0.49 2.46
Adolescent 4.02 3.03 5.00
Young Adult 6.00 5.02 6.99
Adult 34.09 33.11 35.08
Middle Aged 35.87 34.88 36.85
Aged 14.99 14.01 15.98
80+ 3.28 2.29 4.26

Length of Stay Analysis

7.97% of patient’s were assessed to have outlier length of stays. This was assessed by means of a cutoff of \(1.5*IQR\) below the first and above the third quartile.

Patient length of stay density visualization

3D Plot

2D Plot

Length of Stay by Age Group

ICD Analysis

ICD Chapter Percentage (%) Lower 95% CI Upper 95% CI
Infectious & Parasitic 3.36 2.34 4.39
Neoplasms 18.67 17.66 19.71
Blood & Immune 0.48 0.00 1.51
Endocrine, etc 2.55 1.53 3.58
Mental & Behavioural 0.23 0.00 1.27
Nervous System 0.19 0.00 1.22
Eye & Adnexa 0.05 0.00 1.09
Ear & Mastoid 0.02 0.00 1.05
Circulatory System 5.37 4.35 6.40
Respiratory System 0.47 0.00 1.50
Digestive System 48.53 47.51 49.56
Skin & Subcutaneous 5.78 4.76 6.81
Musculoskeletal 1.15 0.13 2.18
Genitourinary System 2.96 1.94 3.99
Pregnancy 1.09 0.07 2.13
Perinatal 0.02 0.00 1.05
Congenital 0.45 0.00 1.48
Abnormal Findings 1.80 0.78 2.84
Injury, Poisoning, etc 1.00 0.00 2.03
Morbidity & Mortality 0.15 0.00 1.18
Influencing Factors 0.90 0.00 1.93
Special Purpose 0.01 0.00 1.04
Neoplasm Morphology 4.78 3.76 5.82

Full Dataset

Top Ten Codes

Demographic ICD Flow

ICD Chapter Sankey Flow

ICD Code Sankey Flow

Length of Stay Regression Analysis

Analysis of predictors of a length of stay greater than 5 days in a surgical ward at a Wits institution.

Crosstable Analysis

Sex Crosstable
Fields 5 or Less More than 5
Female 3089 3025
Male 2496 2976
Other 3 2
Ethnicity Crosstable
Fields 5 or Less More than 5
Asian 3 0
Black 5128 5538
Coloured 171 178
Indian 99 81
Other 10 5
White 177 201
Age Group Crosstable
Fields 5 or Less More than 5
Infant 15 12
Preschool Child 0 0
Child 108 56
Adolescent 290 168
Young Adult 451 219
Adult 2096 1788
Middle Aged 1763 2441
Aged 691 1093
80+ 174 226
Discharge Ward Crosstable
Fields 5 or Less More than 5
Burns Unit 0 1
Trauma Unit 0 2
Unit 1 1743 2079
Unit 3 1409 1729
Unit 4 1160 697
Unit 5 946 1028
Unknown 274 276
Vascular 56 191
Type of Discharge Crosstable
Fields 5 or Less More than 5
Declined Treatment 18 23
Demised 1 0
Home 4678 4995
Other 714 698
Transfer 177 287
ICD Chapter Crosstable
Fields 5 or Less More than 5
Infectious & Parasitic 131 211
Neoplasms 668 1248
Blood & Immune 21 29
Endocrine, etc 81 175
Mental & Behavioural 15 8
Nervous System 9 10
Eye & Adnexa 2 3
Ear & Mastoid 1 1
Circulatory System 178 346
Respiratory System 19 27
Digestive System 2526 2305
Skin & Subcutaneous 389 178
Musculoskeletal 43 83
Genitourinary System 200 93
Pregnancy 84 21
Perinatal 0 2
Congenital 20 23
Abnormal Findings 105 76
Injury, Poisoning, etc 55 45
Morbidity & Mortality 10 4
Influencing Factors 32 55
Special Purpose 0 2
Neoplasm Morphology 155 345
ICD Block Title Crosstable
Fields 5 or Less More than 5
(A00-A09) Intestinal infectious diseases 23 45
(A15-A19) Tuberculosis 17 35
(A20-A28) Certain zoonotic bacterial diseases 0 1
(A30-A49) Other bacterial diseases 9 31
(A50-A64) Infections with a predominantly sexual mode of transmission 18 16
(A65-A69) Other spirochaetal diseases 1 0
(A80-A89) Viral infections of the central nervous system 0 1
(B00-B09) Viral infections characterized by skin and mucous membrane lesions 3 0
(B15-B19) Viral hepatitis 6 5
(B20-B24) Human immunodeficiency virus [HIV] disease 20 41
(B25-B34) Other viral diseases 0 2
(B35-B49) Mycoses 10 4
(B65-B83) Helminthiases 5 14
(B95-B98) Bacterial, viral and other infectious agents 3 11
(B99) Other infectious diseases 16 5
(C00-C14) Malignant neoplasms, stated or presumed to be primary, of specified sites, except of lymphoid, haematopoietic and related tissue: Lip, oral cavity and pharynx 1 0
(C15-C26) Malignant neoplasms, stated or presumed to be primary, of specified sites, except of lymphoid, haematopoietic and related tissue: Digestive organs 311 878
(C30-C39) Malignant neoplasms, stated or presumed to be primary, of specified sites, except of lymphoid, haematopoietic and related tissue: Respiratory and intrathoracic organs 1 1
(C40-C41) Malignant neoplasms, stated or presumed to be primary, of specified sites, except of lymphoid, haematopoietic and related tissue: Bone and articular cartilage 0 1
(C43-C44) Malignant neoplasms, stated or presumed to be primary, of specified sites, except of lymphoid, haematopoietic and related tissue: Skin 4 17
(C45-C49) Malignant neoplasms, stated or presumed to be primary, of specified sites, except of lymphoid, haematopoietic and related tissue: Mesothelial and soft tissue 10 16
(C50) Malignant neoplasms, stated or presumed to be primary, of specified sites, except of lymphoid, haematopoietic and related tissue: Breast 195 170
(C51-C57) Malignant neoplasms, stated or presumed to be primary, of specified sites, except of lymphoid, haematopoietic and related tissue: Female genital organs 10 21
(C60-C63) Malignant neoplasms, stated or presumed to be primary, of specified sites, except of lymphoid, haematopoietic and related tissue: Male genital organs 6 3
(C64-C68) Malignant neoplasms, stated or presumed to be primary, of specified sites, except of lymphoid, haematopoietic and related tissue: Urinary tract 1 1
(C69-C72) Malignant neoplasms, stated or presumed to be primary, of specified sites, except of lymphoid, haematopoietic and related tissue: Eye, brain and other parts of central nervous system 0 1
(C73-C75) Malignant neoplasms, stated or presumed to be primary, of specified sites, except of lymphoid, haematopoietic and related tissue: Thyroid and other endocrine glands 19 14
(C76-C80) Malignant neoplasms of ill-defined, secondary and unspecified sites 3 6
(C81-C96) Malignant neoplasms, stated or presumed to be primary, of lymphoid, haematopoietic and related tissue 5 6
(C97) Malignant neoplasms of independent (primary) multiple sites 0 2
(D00-D09) In situ neoplasms 15 27
(D10-D36) Benign neoplasms 62 50
(D37-D48) Neoplasms of uncertain or unknown behaviour [see note, page 226] 25 34
(D50-D53) Nutritional anaemias 16 12
(D55-D59) Haemolytic anaemias 2 2
(D60-D64) Aplastic and other anaemias 0 1
(D65-D69) Coagulation defects, purpura and other haemorrhagic conditions 1 2
(D70-D77) Other diseases of blood and blood-forming organs 1 11
(D80-D89) Certain disorders involving the immune mechanism 1 1
(E00-E07) Disorders of thyroid gland 36 35
(E10-E14) Diabetes mellitus 32 111
(E15-E16) Other disorders of glucose regulation and pancreatic internal secretion 1 3
(E20-E35) Disorders of other endocrine glands 9 20
(E70-E90) Metabolic disorders 3 6
(F00-F09) Organic, including symptomatic, mental disorders 1 2
(F10-F19) Mental and behavioural disorders due to psychoactive substance use 3 0
(F20-F29) Schizophrenia, schizotypal and delusional disorders 0 1
(F30-F39) Mood [affective] disorders 3 1
(F40-F48) Neurotic, stress-related and somatoform disorders 0 1
(F50-F59) Behavioural syndromes associated with physiological disturbances and physical factors 1 0
(F70-F79) Mental retardation 0 2
(F90-F98) Behavioural and emotional disorders with onset usually occurring in childhood and adolescence 1 0
(F99) Unspecified mental disorder 6 1
(G00-G09) Inflammatory diseases of the central nervous system 4 2
(G10-G14) Systemic atrophies primarily affecting the central nervous system 0 2
(G40-G47) Episodic and paroxysmal disorders 0 2
(G50-G59) Nerve, nerve root and plexus disorders 2 0
(G70-G73) Diseases of myoneural junction and muscle 2 2
(G80-G83) Cerebral palsy and other paralytic syndromes 1 1
(G90-G99) Other disorders of the nervous system 0 1
(H00-H06) Disorders of eyelid, lacrimal system and orbit 2 0
(H25-H28) Disorders of lens 0 2
(H46-H48) Disorders of optic nerve and visual pathways 0 1
(H60-H62) Diseases of external ear 1 0
(H90-H95) Other disorders of ear 0 1
(I05-I09) Chronic rheumatic heart diseases 3 1
(I10-I15) Hypertensive diseases 48 83
(I20-I25) Ischaemic heart diseases 2 3
(I26-I28) Pulmonary heart disease and diseases of pulmonary circulation 2 10
(I30-I52) Other forms of heart disease 6 7
(I60-I69) Cerebrovascular diseases 0 4
(I70-I79) Diseases of arteries, arterioles and capillaries 49 163
(I80-H89) Diseases of veins, lymphatic vessels and lymph nodes, not elsewhere classified 64 69
(I95-I99) Other and unspecified disorders of the circulatory system 4 6
(J00-J06) Acute upper respiratory infections 1 0
(J09-J18) Influenza and pneumonia 1 7
(J20-J22) Other acute lower respiratory infections 0 2
(J30-J39) Other diseases of upper respiratory tract 1 2
(J40-J47) Chronic lower respiratory diseases 8 7
(J80-J84) Other respiratory diseases principally affecting the interstitium 0 1
(J85-J94) Other diseases of pleura 3 5
(J85-J94) Suppurative and necrotic conditions of lower respiratory tract 5 2
(J95-J99) Other diseases of the respiratory system 0 1
(K00-K14) Diseases of oral cavity, salivary glands and jaws 3 2
(K20-K31) Diseases of oesophagus, stomach and duodenum 448 320
(K35-K38) Diseases of appendix 466 394
(K40-K46) Hernia 378 218
(K50-K52) Noninfective enteritis and colitis 14 11
(K55-K64) Other diseases of intestines 335 308
(K65-K67) Diseases of peritoneum 6 11
(K70-K77) Diseases of liver 15 66
(K80-K87) Disorders of gallbladder, biliary tract and pancreas 763 900
(K90-K93) Other diseases of the digestive system 98 75
(L00-L08) Infections of the skin and subcutaneous tissue 361 149
(L10-L14) Bullous disorders 2 0
(L60-L75) Disorders of skin appendages 3 5
(L80-L99) Other disorders of the skin and subcutaneous tissue 23 24
(M00-M25) Arthropathies: Arthrosis 1 1
(M00-M25) Arthropathies: Infectious arthropathies 1 2
(M00-M25) Arthropathies: Inflammatory polyarthropathies 5 4
(M00-M25) Arthropathies: Other joint disorders 0 2
(M30-M36) Systemic connective tissue disorders 2 1
(M40-M54) Dorsopathies: Deforming dorsopathies 4 1
(M60-M79) Soft tissue disorders: Disorders of muscles 5 10
(M60-M79) Soft tissue disorders: Disorders of synovium and tendon 2 1
(M60-M79) Soft tissue disorders: Other soft tissue disorders 19 54
(M80-M94) Osteopathies and chondropathies: Chondropathies 1 0
(M80-M94) Osteopathies and chondropathies: Other osteopathies 2 3
(M800) Morphology Classification: Neoplasms, NOS 6 26
(M801-M804) Morphology Classification: Neoplasms, NOS 3 11
(M805-M808) Morphology Classification: Squamous cell neoplasms 19 40
(M809-M811) Morphology Classification: Basal cell neoplasms 0 2
(M812-M813) Morphology Classification: Transitional cell papillomas and carcinomas 0 1
(M814-M838) Morphology Classification: Adenomas and adenocarcinomas 83 201
(M844-M849) Morphology Classification: Cystic, mucinous and serous neoplasms 5 2
(M850-M854) Morphology Classification: Ductal and lobular neoplasms 0 2
(M868-M871) Morphology Classification: Paragangliomas and glomus tumours 0 3
(M872-M879) Morphology Classification: Naevi and melanomas 0 2
(M880) Morphology Classification: 3 6
(M881-M883) Morphology Classification: Fibromatous neoplasms 3 12
(M884) Morphology Classification: Myxomatous neoplasms 0 1
(M885-M888) Morphology Classification: Lipomatous neoplasms 3 3
(M889-M892) Morphology Classification: Myomatous neoplasms 0 1
(M893-M899) Morphology Classification: Complex mixed and stromal neoplasms 2 18
(M900-M903) Morphology Classification: Fibroepithelial neoplasms 25 4
(M904) Morphology Classification: Synovial-like neoplasms 0 1
(M906-M909) Morphology Classification: Germ cell neoplasms 0 2
(M912-M916) Morphology Classification: Blood vessel tumours 0 1
(M918-M924) Morphology Classification: Osseous and chondromatous neoplasms 1 0
(M95-M99) Other disorders of the musculoskeletal system and connective tissue 1 4
(M954-M957) Morphology Classification: Nerve sheath tumours 1 2
(M959-M971) Morphology Classification: Hodgkin and non-Hodgkin lymphoma 0 3
(M995-M997) Morphology Classification: Chronic myeloprpliferative disorders 1 1
(N10-N16) Renal tubulo-interstitial diseases 7 9
(N17-N19) Renal failure 5 23
(N20-N23) Urolithiasis 0 1
(N25-N29) Other disorders of kidney and ureter 3 1
(N30-N39) Other diseases of urinary system 17 8
(N40-N51) Diseases of male genital organs 9 11
(N60-N64) Disorders of breast 120 14
(N70-N77) Inflammatory diseases of female pelvic organs 18 9
(N80-N98) Noninflammatory disorders of female genital tract 21 17
(O00-O08) Pregnancy with abortive outcome 0 6
(O20-O29) Other maternal disorders predominantly related to pregnancy 3 0
(O60-O75) Complications of labour and delivery 2 4
(O80-O84) Delivery 0 1
(O85-O92) Complications predominantly related to the puerperium 79 10
(P80-P83) Conditions involving the integument and temperature regulation of fetus and newborn 0 1
(P90-P96) Other disorders originating in the perinatal period 0 1
(Q10-Q18) Congenital malformations of eye, ear, face and neck 2 0
(Q20-Q28) Congenital malformations of the circulatory system 0 1
(Q38-Q45) Other congenital malformations of the digestive system 12 13
(Q50-Q56) Congenital malformations of genital organs 1 3
(Q80-Q89) Other congenital malformations 4 5
(Q90-Q99) Chromosomal abnormalities, not elsewhere classified 1 1
(R00-R09) Symptoms and signs involving the circulatory and respiratory systems 1 0
(R10-R19) Symptoms and signs involving the digestive system and abdomen 86 55
(R20-R23) Symptoms and signs involving the skin and subcutaneous tissue 15 8
(R30-R39) Symptoms and signs involving the urinary system 0 1
(R50-R69) General symptoms and signs 1 6
(R70-R79) Abnormal findings on examination of blood, without diagnosis 1 0
(R83-R89) Abnormal findings on examination of other body fluids, substances and tissues, without diagnosis 1 0
(R90-R94) Abnormal findings on diagnostic imaging and in function studies, without diagnosis 0 6
(S00-S09) Injuries to the head 1 0
(S10-S19) Injuries to the neck 1 0
(S20-S29) Injuries to the thorax 0 1
(S30-S39) Injuries to the abdomen, lower back, lumbar spine and pelvis 5 25
(S40-S49) Injuries to the shoulder and upper arm 1 0
(S70-S79) Injuries to the hip and thigh 0 2
(S80-S89) Injuries to the knee and lower leg 1 2
(S90-S99) Injuries to the ankle and foot 2 0
(T00-T07) Injuries involving multiple body regions 1 0
(T15-T19) Effects of foreign body entering through natural orifice 5 0
(T20-T32) Burns and corrosions: Burns and corrosions confined to eye and internal organs 1 0
(T20-T32) Burns and corrosions: Burns and corrosions of external body surface, specified by site 3 0
(T36-T50) Poisoning by drugs, medicaments and biological substances 10 2
(T51-T65) Toxic effects of substances chiefly nonmedicinal as to source 17 2
(T80-T88) Complications of surgical and medical care, not elsewhere classified 7 11
(U50) Drug resistant tuberculosis 0 2
(V01-V09) Accidents: Transport accidents: Pedestrian injured in transport accident 0 1
(W75-W84) Accidents: Other external causes of accidental injury: Other accidental threats to breathing 4 0
(X40-X49) Accidents: Other external causes of accidental injury: Accidental poisoning by and exposure to noxious substances 0 1
(X60-X84) Intentional self-harm 6 0
(X85-Y09) Assault 0 1
(Y83-Y84) Complications of medical and surgical care: Surgical and other medical procedures as the cause of abnormal reaction of the patient, or of later complication, without mention of misadventure at the time of the procedure 0 1
(Z00-Z13) Persons encountering health services for examination and investigation 1 1
(Z40-Z54) Persons encountering health services for specific procedures and health care 6 20
(Z70-Z76) Persons encountering health services in other circumstances 1 0
(Z80-Z99) Persons with potential health hazards related to family and personal history and certain conditions influencing health status 24 34

Univariate Regression Analysis

Gender Regression

Wald Test

Elements Results
Chi Squared 29.9

Degrees of Freedom 2.0

p Value 0.0 ***

Fit Summary

Elements Results
Null Deviance 15862.42

Null Degrees of Freedom 11451.00

Residual Deviance 15832.47

Residual Degrees of Freedom 11449.00

Akaike Information Criterion (AIC) 15838.47

Hoslem Test Chi-Squared 11452.00

Hoslem Degrees of Freedom 8.00

Hoslem p Value 0.00 ***
Gender Odds Matrix
Ethnicity Regression

Wald Test

Elements Results
Chi Squared 5.1400

Degrees of Freedom 4.0000

p Value 0.2733

Fit Summary

Elements Results
Null Deviance 15862.42

Null Degrees of Freedom 11451.00

Residual Deviance 15857.14

Residual Degrees of Freedom 11447.00

Akaike Information Criterion (AIC) 15867.14

Hoslem Test Chi-Squared 11452.00

Hoslem Degrees of Freedom 8.00

Hoslem p Value 0.00 ***
Ethnicity Odds Matrix
Age Group Regression

Wald Test

Elements Results
Chi Squared 332.39

Degrees of Freedom 7.00

p Value 0.00 ***

Fit Summary

Elements Results
Null Deviance 15862.42

Null Degrees of Freedom 11451.00

Residual Deviance 15518.43

Residual Degrees of Freedom 11444.00

Akaike Information Criterion (AIC) 15534.43

Hoslem Test Chi-Squared 11452.00

Hoslem Degrees of Freedom 8.00

Hoslem p Value 0.00 ***
Age Group Odds Matrix
Discharge Ward Regression

Wald Test

Elements Results
Chi Squared 224.98

Degrees of Freedom 5.00

p Value 0.00 ***

Fit Summary

Elements Results
Null Deviance 15862.42

Null Degrees of Freedom 11451.00

Residual Deviance 15621.72

Residual Degrees of Freedom 11446.00

Akaike Information Criterion (AIC) 15633.72

Hoslem Test Chi-Squared 11452.00

Hoslem Degrees of Freedom 8.00

Hoslem p Value 0.00 ***
Discharge Ward Odds Matrix
Type of Discharge Regression

Wald Test

Elements Results
Chi Squared 20.0900

Degrees of Freedom 3.0000

p Value 0.0002 ***

Fit Summary

Elements Results
Null Deviance 15862.42

Null Degrees of Freedom 11451.00

Residual Deviance 15841.91

Residual Degrees of Freedom 11448.00

Akaike Information Criterion (AIC) 15849.91

Hoslem Test Chi-Squared 11452.00

Hoslem Degrees of Freedom 8.00

Hoslem p Value 0.00 ***
Type of Discharge Odds Matrix
ICD Chapter Regression

Wald Test

Elements Results
Chi Squared 492.25

Degrees of Freedom 17.00

p Value 0.00 ***
ICD Chapter Odds Matrix
LS0tDQp0aXRsZTogIkVEIEFuYWx5c2lzIg0KYXV0aG9yOiAiQnJhZCBTZWdhbCINCmRhdGU6ICI3LzE1LzIwMTkiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRSwgY2FjaGU9VFJVRX0NCnJlcXVpcmUoa25pdHIpDQpyZXF1aXJlKHJlYWR4bCkNCnJlcXVpcmUodGlkeXZlcnNlKQ0KcmVxdWlyZShkcGx5cikNCnJlcXVpcmUoYW9kKQ0KcmVxdWlyZShnZ3Bsb3QyKQ0KcmVxdWlyZShwbG90bHkpDQpyZXF1aXJlKHhsc3gpDQpyZXF1aXJlKERlc2NUb29scykNCnJlcXVpcmUoUHJvcENJcykNCnJlcXVpcmUoZ2dhbGx1dmlhbCkNCnJlcXVpcmUodmNkKQ0KcmVxdWlyZShyZ2wpDQpyZXF1aXJlKHJheXNoYWRlcikNCnJlcXVpcmUobHVicmlkYXRlKQ0KcmVxdWlyZSh6b28pDQpyZXF1aXJlKHJlc2hhcGUyKQ0KcmVxdWlyZShIbWlzYykNCnJlcXVpcmUobWFncml0dHIpDQpyZXF1aXJlKHJnbHdpZGdldCkNCnJlcXVpcmUoaHRtbHRvb2xzKQ0KcmVxdWlyZShybWFya2Rvd24pDQpyZXF1aXJlKGZvcm1hdHRhYmxlKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0Ka25pdHI6OmtuaXRfaG9va3Mkc2V0KHJnbCA9IGhvb2tfcmdsKQ0KDQpFRCA8LQ0KICByZWFkX2V4Y2VsKA0KICAgICJEOi9PbmVEcml2ZS9PbmVEcml2ZS9Eb2N1bWVudHMvTUJCQ2gvUmVzZWFyY2ggUHJvamVjdHMvQklTL0VEL1BhdGllbnQgRXh0cmFjdC1CcmFkLVBDLnhsc3giLA0KICAgIGNvbF90eXBlcyA9IGMoDQogICAgICAibnVtZXJpYyIsDQogICAgICAidGV4dCIsDQogICAgICAidGV4dCIsDQogICAgICAiZGF0ZSIsDQogICAgICAidGV4dCIsDQogICAgICAidGV4dCIsDQogICAgICAidGV4dCIsDQogICAgICAidGV4dCIsDQogICAgICAidGV4dCIsDQogICAgICAidGV4dCIsDQogICAgICAidGV4dCIsDQogICAgICAidGV4dCIsDQogICAgICAidGV4dCIsDQogICAgICAidGV4dCIsDQogICAgICAidGV4dCIsDQogICAgICAidGV4dCIsDQogICAgICAidGV4dCIsDQogICAgICAibnVtZXJpYyIsDQogICAgICAibnVtZXJpYyIsDQogICAgICAiZGF0ZSINCiAgICApDQogICkNCg0KRGlzY2hhcmdlIDwtDQogIHJlYWRfZXhjZWwoDQogICAgIkQ6L09uZURyaXZlL09uZURyaXZlL0RvY3VtZW50cy9NQkJDaC9SZXNlYXJjaCBQcm9qZWN0cy9CSVMvRUQvRnVsbCBFRCBEYXRhYmFzZS54bHN4IiwNCiAgICBzaGVldCA9ICJEaXNjaGFyZ2VSZWNvcmRzIiwNCiAgICBjb2xfdHlwZXMgPSBjKA0KICAgICAgIm51bWVyaWMiLA0KICAgICAgIm51bWVyaWMiLA0KICAgICAgInRleHQiLA0KICAgICAgInRleHQiLA0KICAgICAgInRleHQiLA0KICAgICAgInRleHQiLA0KICAgICAgInRleHQiLA0KICAgICAgInRleHQiLA0KICAgICAgInRleHQiLA0KICAgICAgIm51bWVyaWMiLA0KICAgICAgIm51bWVyaWMiLA0KICAgICAgIm51bWVyaWMiLA0KICAgICAgIm51bWVyaWMiLA0KICAgICAgIm51bWVyaWMiLA0KICAgICAgIm51bWVyaWMiLA0KICAgICAgIm51bWVyaWMiLA0KICAgICAgIm51bWVyaWMiLA0KICAgICAgIm51bWVyaWMiLA0KICAgICAgImRhdGUiLA0KICAgICAgInRleHQiLA0KICAgICAgInRleHQiLA0KICAgICAgInRleHQiLA0KICAgICAgInRleHQiLA0KICAgICAgInRleHQiLA0KICAgICAgInRleHQiLA0KICAgICAgInRleHQiLA0KICAgICAgInRleHQiLA0KICAgICAgInRleHQiLA0KICAgICAgIm51bWVyaWMiLA0KICAgICAgImRhdGUiLA0KICAgICAgInRleHQiLA0KICAgICAgInRleHQiLA0KICAgICAgInRleHQiLA0KICAgICAgInRleHQiLA0KICAgICAgInRleHQiLA0KICAgICAgImRhdGUiLA0KICAgICAgInRleHQiLA0KICAgICAgImRhdGUiLA0KICAgICAgImRhdGUiLA0KICAgICAgInRleHQiDQogICAgKQ0KICApDQpEaWFnbm9zaXMgPC0NCiAgcmVhZF9leGNlbCgNCiAgICAiRDovT25lRHJpdmUvT25lRHJpdmUvRG9jdW1lbnRzL01CQkNoL1Jlc2VhcmNoIFByb2plY3RzL0JJUy9FRC9GdWxsIEVEIERhdGFiYXNlLnhsc3giLA0KICAgIHNoZWV0ID0gIkRpYWdub3NpcyIsDQogICAgY29sX3R5cGVzID0gYygibnVtZXJpYyIsDQogICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgInRleHQiKQ0KICApDQpJQ0QgPC0NCiAgcmVhZF9leGNlbCgNCiAgICAiRDovT25lRHJpdmUvT25lRHJpdmUvRG9jdW1lbnRzL01CQkNoL1Jlc2VhcmNoIFByb2plY3RzL0JJUy9FRC9GdWxsIEVEIERhdGFiYXNlLnhsc3giLA0KICAgIHNoZWV0ID0gIklDRDEwQ29kZSIsDQogICAgY29sX3R5cGVzID0gYygibnVtZXJpYyIsDQogICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJ0ZXh0IiwgInRleHQiKQ0KICApDQpJQ0RCbG9jayA8LQ0KICByZWFkX2V4Y2VsKA0KICAgICJEOi9PbmVEcml2ZS9PbmVEcml2ZS9Eb2N1bWVudHMvTUJCQ2gvUmVzZWFyY2ggUHJvamVjdHMvQklTL0VEL0Z1bGwgRUQgRGF0YWJhc2UueGxzeCIsDQogICAgc2hlZXQgPSAiSUNEMTBDb2RlQmxvY2siLA0KICAgIGNvbF90eXBlcyA9IGMoIm51bWVyaWMiLA0KICAgICAgICAgICAgICAgICAgIm51bWVyaWMiLCAidGV4dCIpDQogICkNCklDRENoYXAgPC0NCiAgcmVhZF9leGNlbCgNCiAgICAiRDovT25lRHJpdmUvT25lRHJpdmUvRG9jdW1lbnRzL01CQkNoL1Jlc2VhcmNoIFByb2plY3RzL0JJUy9FRC9GdWxsIEVEIERhdGFiYXNlLnhsc3giLA0KICAgIHNoZWV0ID0gIklDRDEwQ29kZUNoYXB0ZXIiLA0KICAgIGNvbF90eXBlcyA9IGMoIm51bWVyaWMiLA0KICAgICAgICAgICAgICAgICAgInRleHQiLCAidGV4dCIpDQogICkNCkNvbXBsaWNhdGlvbnMgPC0NCiAgcmVhZF9leGNlbCgNCiAgICAiRDovT25lRHJpdmUvT25lRHJpdmUvRG9jdW1lbnRzL01CQkNoL1Jlc2VhcmNoIFByb2plY3RzL0JJUy9FRC9GdWxsIEVEIERhdGFiYXNlLnhsc3giLA0KICAgIHNoZWV0ID0gIkNvbXBsaWNhdGlvbnMiLA0KICAgIGNvbF90eXBlcyA9IGMoDQogICAgICAibnVtZXJpYyIsDQogICAgICAibnVtZXJpYyIsDQogICAgICAibnVtZXJpYyIsDQogICAgICAiZGF0ZSIsDQogICAgICAidGV4dCIsDQogICAgICAidGV4dCIsDQogICAgICAibnVtZXJpYyINCiAgICApDQogICkNClJhZGlvbG9neSA8LQ0KICByZWFkX2V4Y2VsKA0KICAgICJEOi9PbmVEcml2ZS9PbmVEcml2ZS9Eb2N1bWVudHMvTUJCQ2gvUmVzZWFyY2ggUHJvamVjdHMvQklTL0VEL0Z1bGwgRUQgRGF0YWJhc2UueGxzeCIsDQogICAgc2hlZXQgPSAiUmFkaW9sb2dpZXMiLA0KICAgIGNvbF90eXBlcyA9IGMoIm51bWVyaWMiLA0KICAgICAgICAgICAgICAgICAgIm51bWVyaWMiLCAidGV4dCIsICJ0ZXh0IiwgImRhdGUiLA0KICAgICAgICAgICAgICAgICAgInRleHQiKQ0KICApDQpNZWRpY2F0aW9uIDwtDQogIHJlYWRfZXhjZWwoDQogICAgIkQ6L09uZURyaXZlL09uZURyaXZlL0RvY3VtZW50cy9NQkJDaC9SZXNlYXJjaCBQcm9qZWN0cy9CSVMvRUQvRnVsbCBFRCBEYXRhYmFzZS54bHN4IiwNCiAgICBzaGVldCA9ICJNZWRpY2F0aW9ucyIsDQogICAgY29sX3R5cGVzID0gYygibnVtZXJpYyIsDQogICAgICAgICAgICAgICAgICAibnVtZXJpYyIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsDQogICAgICAgICAgICAgICAgICAidGV4dCIsICJ0ZXh0IikNCiAgKQ0KSUNVIDwtDQogIHJlYWRfZXhjZWwoDQogICAgIkQ6L09uZURyaXZlL09uZURyaXZlL0RvY3VtZW50cy9NQkJDaC9SZXNlYXJjaCBQcm9qZWN0cy9CSVMvRUQvRnVsbCBFRCBEYXRhYmFzZS54bHN4IiwNCiAgICBzaGVldCA9ICJJQ1VIaWdoQ2FyZXMiLA0KICAgIGNvbF90eXBlcyA9IGMoIm51bWVyaWMiLA0KICAgICAgICAgICAgICAgICAgIm51bWVyaWMiLCAidGV4dCIsICJkYXRlIiwgImRhdGUiLA0KICAgICAgICAgICAgICAgICAgInRleHQiKQ0KICApDQpQcm9jZWR1cmUgPC0NCiAgcmVhZF9leGNlbCgNCiAgICAiRDovT25lRHJpdmUvT25lRHJpdmUvRG9jdW1lbnRzL01CQkNoL1Jlc2VhcmNoIFByb2plY3RzL0JJUy9FRC9GdWxsIEVEIERhdGFiYXNlLnhsc3giLA0KICAgIHNoZWV0ID0gIlByb2NlZHVyZXMiLA0KICAgIGNvbF90eXBlcyA9IGMoDQogICAgICAibnVtZXJpYyIsDQogICAgICAibnVtZXJpYyIsDQogICAgICAiZGF0ZSIsDQogICAgICAidGV4dCIsDQogICAgICAidGV4dCIsDQogICAgICAidGV4dCIsDQogICAgICAidGV4dCIsDQogICAgICAidGV4dCIsDQogICAgICAidGV4dCIsDQogICAgICAibnVtZXJpYyINCiAgICApDQogICkNClByb2NDb2RlcyA8LQ0KICByZWFkX2V4Y2VsKA0KICAgICJEOi9PbmVEcml2ZS9PbmVEcml2ZS9Eb2N1bWVudHMvTUJCQ2gvUmVzZWFyY2ggUHJvamVjdHMvQklTL0VEL0Z1bGwgRUQgRGF0YWJhc2UueGxzeCIsDQogICAgc2hlZXQgPSAiUHJvY2VkdXJlQ29kZXMiLA0KICAgIGNvbF90eXBlcyA9IGMoIm51bWVyaWMiLA0KICAgICAgICAgICAgICAgICAgIm51bWVyaWMiLCAidGV4dCIsICJ0ZXh0IikNCiAgKQ0KUHJvY0NvZGVUeXBlIDwtDQogIHJlYWRfZXhjZWwoDQogICAgIkQ6L09uZURyaXZlL09uZURyaXZlL0RvY3VtZW50cy9NQkJDaC9SZXNlYXJjaCBQcm9qZWN0cy9CSVMvRUQvRnVsbCBFRCBEYXRhYmFzZS54bHN4IiwNCiAgICBzaGVldCA9ICJQcm9jZWR1cmVDb2RlVHlwZXMiLA0KICAgIGNvbF90eXBlcyA9IGMoIm51bWVyaWMiLA0KICAgICAgICAgICAgICAgICAgInRleHQiKQ0KICApDQpIaXN0b2xvZ3kgPC0NCiAgcmVhZF9leGNlbCgNCiAgICAiRDovT25lRHJpdmUvT25lRHJpdmUvRG9jdW1lbnRzL01CQkNoL1Jlc2VhcmNoIFByb2plY3RzL0JJUy9FRC9GdWxsIEVEIERhdGFiYXNlLnhsc3giLA0KICAgIHNoZWV0ID0gIkhpc3RvbG9naWVzIiwNCiAgICBjb2xfdHlwZXMgPSBjKCJudW1lcmljIiwNCiAgICAgICAgICAgICAgICAgICJudW1lcmljIiwgImRhdGUiLCAidGV4dCIsICJ0ZXh0IikNCiAgKQ0KDQojIC0tIEZ1bmN0aW9ucyAtLQ0KY29tcGxldGlvbiA8LSBmdW5jdGlvbihpbnB1dCkgew0KICB0ZXN0IDwtIGMoKQ0KICB0ZXN0X2NvdW50IDwtIGMoKQ0KICBmb3IgKHZlYyBpbiAxOmxlbmd0aChpbnB1dCkpIHsNCiAgICB2YXJfY291bnQgPC0gaW5wdXQgJT4lDQogICAgICBmaWx0ZXIoIWlzLm5hKGlucHV0W3ZlY10pIHwgaW5wdXRbdmVjXSAhPSAwKSAlPiUNCiAgICAgIGNvdW50KCkNCiAgICB0ZXN0IDwtIHJiaW5kKHRlc3QsIG5hbWVzKGlucHV0KVt2ZWNdKQ0KICAgIHRlc3RfY291bnQgPC0NCiAgICAgIHJiaW5kKHRlc3RfY291bnQsIHJvdW5kKCh2YXJfY291bnQkbiAvIGNvdW50KGlucHV0KSRuKSwgMikpDQogIH0NCiAgcmV0dXJuKGRhdGEuZnJhbWUodmFyaWFibGUgPSB0ZXN0LCBmcmFjdGlvbiA9IHRlc3RfY291bnQpKQ0KfQ0KRGF0YVN1bW1hcnkgPC0gZnVuY3Rpb24oaW5wdXQpIHsNCiAgZml2ZV9udW0gPC0gZml2ZW51bShpbnB1dCkNCiAgTWVhbiA8LSBtZWFuKGlucHV0KQ0KICBTRCA8LSBzZChpbnB1dCkNCiAgdXBwQ0kgPC0gTWVhbiArIDIgKiBTRA0KICBsb3dDSSA8LSBNZWFuIC0gMiAqIFNEDQogIG91dHB1dCA8LQ0KICAgIGRhdGEuZnJhbWUoDQogICAgICBNaW4gPSBmaXZlX251bVsxXSwNCiAgICAgICJRdWFydGlsZSAxIiA9IGZpdmVfbnVtWzJdLA0KICAgICAgTWVkaWFuID0gZml2ZV9udW1bM10sDQogICAgICAiUXVhcnRpbGUgMyIgPSBmaXZlX251bVs0XSwNCiAgICAgIE1heCA9IGZpdmVfbnVtWzVdLA0KICAgICAgSVFSID0gZml2ZV9udW1bNF0gLSBmaXZlX251bVsyXSwNCiAgICAgIFNELA0KICAgICAgTWVhbiwNCiAgICAgICdVcHBlci5DSScgPSB1cHBDSSwNCiAgICAgICdMb3dlci5DSScgPSBsb3dDSQ0KICAgICkNCiAgcmV0dXJuKG91dHB1dCkNCn0NCg0KbW9udGhfY29tcCA8LSBmdW5jdGlvbihpbnB1dCkgew0KICBjb21wIDwtIE5VTEwNCiAgZm9yIChrIGluIDE6MTIpIHsNCiAgICBtb250aCA8LSBNZXJnZWRJQ0QgJT4lDQogICAgICBmaWx0ZXIoYXMubnVtZXJpYyhmb3JtYXQoTWVyZ2VkSUNEJEVucm9sLCAnJVknKSkgPT0gaW5wdXQsIGFzLm51bWVyaWMoZm9ybWF0KE1lcmdlZElDRCRFbnJvbCwgJyVtJykpID09IGspDQogICAgIyBwcmludChucm93KG1vbnRoKSkNCiAgICBpZiAobnJvdyhtb250aCkgPT0gMCkgew0KICAgICAgbW9udGggPC0gY29tcGxldGlvbihtb250aCkNCiAgICAgIG1vbnRoIDwtIG11dGF0ZShtb250aCwgZnJhY3Rpb24gPSAwLjApDQogICAgfSBlbHNlew0KICAgICAgbW9udGggPC0gY29tcGxldGlvbihtb250aCkNCiAgICB9DQogICAgbW9udGggPC0gbW9udGggJT4lDQogICAgICByZW5hbWUoISFwYXN0ZShrKSA6PSBmcmFjdGlvbikgI05ldyBleHByZXNzaW9uIGVuYWJsZXMgbmFtaW5nIG9mIGEgdmFyaWFibGUgYnkgYSBzdHJpbmcNCiAgICBpZiAoayA9PSAxKSB7DQogICAgICBjb21wIDwtIG1vbnRoDQogICAgfSBlbHNlew0KICAgICAgY29tcCA8LSBsZWZ0X2pvaW4oY29tcCwgbW9udGgpDQogICAgfQ0KICAgICNwcmludChjb21wKQ0KICB9DQogIGNvbXAgPC0gY29sdW1uX3RvX3Jvd25hbWVzKGNvbXAsIHZhciA9ICJ2YXJpYWJsZSIpDQogIHJldHVybihjb21wKQ0KfQ0KDQojQ2FsY3VsYXRlIDk1JSBDSXMgZnJvbSBFdGhuaWNpdGllcyDihpIgRXh0cmFjdHMgVmFyaWFibGVzICYgVGl0bGVzIGZyb20gVGFibGUgU3VtbWFyeQ0KI0lucHV0IGlzIEFycmF5IEZpbHRlcmVkIG9uIEZpZWxkIG9mIEludGVyZXN0DQpNdWx0aV9DSSA8LSBmdW5jdGlvbihpbnB1dCkgew0KICBDSSA8LSBkYXRhLmZyYW1lKEZpZWxkcyA9IG5hbWVzKHRhYmxlKGlucHV0KSksDQogICAgICAgICAgICAgTXVsdGlub21DSSgNCiAgICAgICAgICAgICAgIGFzLnZlY3Rvcih0YWJsZShpbnB1dCkpLA0KICAgICAgICAgICAgICAgY29uZi5sZXZlbCA9IDAuOTUsDQogICAgICAgICAgICAgICBtZXRob2QgPSAic2lzb25nbGF6Ig0KICAgICAgICAgICAgICkpDQogIENJJGVzdCA8LSByb3VuZChDSSRlc3QqMTAwLCAyKQ0KICBDSSRsd3IuY2kgPC0gcm91bmQoQ0kkbHdyLmNpKjEwMCwgMikNCiAgQ0kkdXByLmNpIDwtIHJvdW5kKENJJHVwci5jaSoxMDAsIDIpDQogIENJIDwtQ0kgJT4lDQogICAgcmVuYW1lKCJQZXJjZW50YWdlICglKSIgPSAiZXN0IiwgIkxvd2VyIDk1JSBDSSIgPSBsd3IuY2ksICJVcHBlciA5NSUgQ0kiID0gdXByLmNpKQ0KICByZXR1cm4oQ0kpDQp9DQoNCmFnZV9ncm91cHMgPC0gZnVuY3Rpb24oaW5wdXQpIHsNCiAgZ3JvdXAgPC0gIiINCiAgaWYgKGlucHV0IDwgMikgew0KICAgIGdyb3VwIDwtICJJbmZhbnQiDQogIH0NCiAgaWYgKGlucHV0ID49IDIgJiYgaW5wdXQgPCA2KSB7DQogICAgZ3JvdXAgPC0gIlByZXNjaG9vbCBDaGlsZCINCiAgfQ0KICBpZiAoaW5wdXQgPj0gNiAmJiBpbnB1dCA8IDEzKSB7DQogICAgZ3JvdXAgPC0gIkNoaWxkIg0KICB9DQogIGlmIChpbnB1dCA+PSAxMyAmJiBpbnB1dCA8IDE5KSB7DQogICAgZ3JvdXAgPC0gIkFkb2xlc2NlbnQiDQogIH0NCiAgaWYgKGlucHV0ID49IDE5ICYmIGlucHV0IDwgMjUpIHsNCiAgICBncm91cCA8LSAiWW91bmcgQWR1bHQiDQogIH0NCiAgaWYgKGlucHV0ID49IDI1ICYmIGlucHV0IDwgNDUpIHsNCiAgICBncm91cCA8LSAiQWR1bHQiDQogIH0NCiAgaWYgKGlucHV0ID49IDQ1ICYmIGlucHV0IDwgNjUpIHsNCiAgICBncm91cCA8LSAiTWlkZGxlIEFnZWQiDQogIH0NCiAgaWYgKGlucHV0ID49IDY1ICYmIGlucHV0IDwgODApIHsNCiAgICBncm91cCA8LSAiQWdlZCINCiAgfQ0KICBpZiAoaW5wdXQgPj0gODApIHsNCiAgICBncm91cCA8LSAiODArIg0KICB9DQogIHJldHVybihncm91cCkNCn0NCg0KYWdlX2xpc3QgPC0gYygNCiAgIkluZmFudCIsDQogICJQcmVzY2hvb2wgQ2hpbGQiLA0KICAiQ2hpbGQiLA0KICAiQWRvbGVzY2VudCIsDQogICJZb3VuZyBBZHVsdCIsDQogICJBZHVsdCIsDQogICJNaWRkbGUgQWdlZCIsDQogICJBZ2VkIiwNCiAgIjgwKyINCikNCg0Kb3V0bGllclRlc3QgPC0gZnVuY3Rpb24odmFsSW5wdXQsIHN1bW1hcnlJbnB1dCkgew0KICBvdXRsaWVyIDwtIGMoKQ0KICBmb3IgKHZlYyBpbiB2YWxJbnB1dCkgew0KICAgIGlmICh2ZWMgPiAoc3VtbWFyeUlucHV0JFF1YXJ0aWxlLjMgKyAxLjUgKiBzdW1tYXJ5SW5wdXQkSVFSKSB8DQogICAgICAgIHZlYyA8IChzdW1tYXJ5SW5wdXQkUXVhcnRpbGUuMSAtIDEuNSAqIHN1bW1hcnlJbnB1dCRJUVIpKSB7DQogICAgICBvdXRsaWVyIDwtIHJiaW5kKG91dGxpZXIsIFRSVUUpDQogICAgfSBlbHNlew0KICAgICAgb3V0bGllciA8LSByYmluZChvdXRsaWVyLCBGQUxTRSkNCiAgICB9DQogIH0NCiAgcmV0dXJuKG91dGxpZXIpDQp9DQoNClN1bW1hcnlfVGFibGUgPC0gZnVuY3Rpb24oaW5wdXQpew0KICBmdWxsX3N1bSA8LSBhcy5kYXRhLmZyYW1lKHQoRGF0YVN1bW1hcnkoaW5wdXQpKSkgJT4lDQogICAgcmVuYW1lKFZhbHVlcyA9IFYxKSAlPiUNCiAgICByb3VuZCgyKSAlPiUNCiAgICByb3duYW1lc190b19jb2x1bW4odmFyID0gIlN1bW1hcnkiKSANCiAgZnVsbF9zdW1bOSwxXSA8LSAiVXBwZXIgOTUlIENJIg0KICBmdWxsX3N1bVsxMCwxXSA8LSAiTG93ZXIgOTUlIENJIg0KICANCiAgZm9ybWF0dGFibGUoDQogICAgZnVsbF9zdW0sDQogICAgYWxpZ24gPSBjKCJsIiwgcmVwKCJyIiwgTkNPTChmdWxsX3N1bSkgLSAxKSksDQogICAgbGlzdCgNCiAgICAgICJTdW1tYXJ5IiA9IGZvcm1hdHRlcigic3BhbiIsIHN0eWxlID0gfiBzdHlsZSgNCiAgICAgICAgY29sb3IgPSAiR3JleSIsIGZvbnQud2VpZ2h0ID0gImJvbGQiDQogICAgICApKSwgYFZhbHVlc2AgPSBjb2xvcl90aWxlKCIjYWNkZWVmIiwgIiNiZmZmZmYiKQ0KICAgICkNCiAgKQ0KfQ0KDQpudWxsX3RvX25pbCA8LSBmdW5jdGlvbihpbnB1dCl7DQogIG91dHB1dCA8LSBpbnB1dA0KICBpZihpcy5uYShpbnB1dCkgfCBpcy5udWxsKGlucHV0KSl7DQogICAgaWYoaXMuY2hhcmFjdGVyKGlucHV0KSl7DQogICAgICBvdXRwdXQgPC0gIk5vbmUiDQogICAgfQ0KICAgIGlmKGlzLm51bWVyaWMoaW5wdXQpKXsNCiAgICAgIG91dHB1dCA8LSAwDQogICAgfQ0KICB9DQogIHJldHVybihvdXRwdXQpDQp9DQoNCmNyb3NzX3RhYiA8LSBmdW5jdGlvbih4X2lucHV0LCB5X2lucHV0KXsNCiAgY29sb3JfaWZlbHNlIDwtIGZ1bmN0aW9uKC4uLikgew0KICAgIGZvcm1hdHRlcigic3BhbiIsDQogICAgICAgICAgICAgIHN0eWxlID0gZnVuY3Rpb24oeCkgc3R5bGUoDQogICAgICAgICAgICAgICAgZGlzcGxheSA9ICJibG9jayIsDQogICAgICAgICAgICAgICAgcGFkZGluZyA9ICIwIDRweCIsDQogICAgICAgICAgICAgICAgImJvcmRlci1yYWRpdXMiID0gIjRweCIsDQogICAgICAgICAgICAgICAgImJhY2tncm91bmQtY29sb3IiID0gaWZlbHNlKHggPiAwLCBjc3Njb2xvcihncmFkaWVudChhcy5udW1lcmljKHgpLCAuLi4pKSwgcmVkX3ZhbCkpKQ0KICB9DQogIGNUYWJsZSA8LSBhcy5kYXRhLmZyYW1lLm1hdHJpeCh0YWJsZSh4X2lucHV0LCB5X2lucHV0KSkgJT4lDQogICAgcm93bmFtZXNfdG9fY29sdW1uKCJGaWVsZHMiKSAlPiUNCiAgICByZW5hbWUoIjUgb3IgTGVzcyIgPSAiMCIsICJNb3JlIHRoYW4gNSIgPSAiMSIpICU+JQ0KICAgIGZvcm1hdHRhYmxlKGFsaWduID0gYygibCIsIHJlcCgiciIsIE5DT0woLikgLSAxKSksDQogICAgICAgICAgICAgICAgbGlzdCgNCiAgICAgICAgICAgICAgICAgIGBGaWVsZHNgID0gZm9ybWF0dGVyKCJzcGFuIiwgc3R5bGUgPSB+IHN0eWxlKA0KICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJncmV5IiwgZm9udC53ZWlnaHQgPSAiYm9sZCINCiAgICAgICAgICAgICAgICAgICkpLCANCiAgICAgICAgICAgICAgICAgIGFyZWEoY29sID0gYygiNSBvciBMZXNzIiwgIk1vcmUgdGhhbiA1IikpIH4gY29sb3JfaWZlbHNlKGdyZWVuX21pbiwgZ3JlZW5fbWF4KQ0KICAgICAgICAgICAgICAgICkpDQogIHJldHVybihjVGFibGUpDQp9DQoNCmZpbHRlcl9uaWwgPC0gZnVuY3Rpb24oaW5wdXQpIHsNCiAgZmlsdGVyX2xpc3QgPC0NCiAgICBhcy5kYXRhLmZyYW1lLm1hdHJpeCh0YWJsZShpbnB1dCwgTWVyZ2VkX01lZCRMT1NfT3V0Y29tZSkpICU+JQ0KICAgIHJvd25hbWVzX3RvX2NvbHVtbigiRmllbGRzIikgJT4lDQogICAgZmlsdGVyICguJCIwIiA9PSAwIHwgLiQiMSIgPT0gMCkgJT4lDQogICAgc2VsZWN0KEZpZWxkcykNCiAgcmV0dXJuKGZpbHRlcl9saXN0WywxXSkNCn0NCg0KcmVncmVzc190YWJsZSA8LSBmdW5jdGlvbihpbnB1dCkgew0KICBwVmFsRXZhbCA8LSBmdW5jdGlvbih4KSB7DQogICAgdmFsdWUgPC0gIiINCiAgICBpZiAoeCA8IDAuMSkgew0KICAgICAgdmFsdWUgPC0gIi4iDQogICAgfQ0KICAgIGlmICh4IDwgMC4wNSkgew0KICAgICAgdmFsdWUgPC0gIioiDQogICAgfQ0KICAgIGlmICh4IDwgMC4wMSkgew0KICAgICAgdmFsdWUgPC0gIioqIg0KICAgIH0NCiAgICBpZiAoeCA8IDAuMDAxKSB7DQogICAgICB2YWx1ZSA8LSAiKioqIg0KICAgIH0NCiAgICByZXR1cm4odmFsdWUpDQogIH0NCiAgaW5wdXQkT1IgPC0gcm91bmQoZXhwKGlucHV0JE9SKSwgMikNCiAgaW5wdXQkIjIuNSAlIiA8LSByb3VuZChleHAoaW5wdXQkIjIuNSAlIiksIDIpDQogIGlucHV0JCI5Ny41ICUiIDwtIHJvdW5kKGV4cChpbnB1dCQiOTcuNSAlIiksIDIpDQogIGlucHV0IDwtIGlucHV0ICU+JQ0KICAgIHJvd25hbWVzX3RvX2NvbHVtbigiVmFyaWFibGUiKSAlPiUNCiAgICByZW5hbWUoIjIuNSUiID0gIjIuNSAlIikgJT4lDQogICAgcmVuYW1lKCI5Ny41JSIgPSAiOTcuNSAlIikgJT4lDQogICAgcmVuYW1lKCJwIFZhbCIgPSAicCIpDQogIGlucHV0WywgIiAiXSA8LSBOQQ0KICBmb3JtYXR0YWJsZShpbnB1dCwNCiAgICAgICAgICAgICAgYWxpZ24gPSBjKCJsIiwgcmVwKCJyIiwgTkNPTChpbnB1dCkgLSAxKSksDQogICAgICAgICAgICAgIGxpc3QoDQogICAgICAgICAgICAgICAgYFZhcmlhYmxlYCA9IGZvcm1hdHRlcigic3BhbiIsIHN0eWxlID0gfiBzdHlsZSgNCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImdyZXkiLCBmb250LndlaWdodCA9ICJib2xkIg0KICAgICAgICAgICAgICAgICkpLA0KICAgICAgICAgICAgICAgIGAgYCA9IGZvcm1hdHRlcigNCiAgICAgICAgICAgICAgICAgICJzcGFuIiwNCiAgICAgICAgICAgICAgICAgIHN0eWxlID0gfiBzdHlsZShjb2xvciA9IGlmZWxzZShgcCBWYWxgIDwgMC4wNSwgIiIsICIiKSksDQogICAgICAgICAgICAgICAgICB+IGljb250ZXh0KA0KICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYHAgVmFsYCA8IDAuMDUsICIiLCAiIiksDQogICAgICAgICAgICAgICAgICAgIHNhcHBseShgcCBWYWxgLCBmdW5jdGlvbih4KQ0KICAgICAgICAgICAgICAgICAgICAgIHBWYWxFdmFsKHgpKQ0KICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgKSkNCn0NCg0Kd2FsZF90YWJsZSA8LSBmdW5jdGlvbihpbnB1dCkgew0KICBwVmFsRXZhbCA8LSBmdW5jdGlvbih4KSB7DQogICAgdmFsdWUgPC0gIiINCiAgICBpZiAoeCA8IDAuMSkgew0KICAgICAgdmFsdWUgPC0gIi4iDQogICAgfQ0KICAgIGlmICh4IDwgMC4wNSkgew0KICAgICAgdmFsdWUgPC0gIioiDQogICAgfQ0KICAgIGlmICh4IDwgMC4wMSkgew0KICAgICAgdmFsdWUgPC0gIioqIg0KICAgIH0NCiAgICBpZiAoeCA8IDAuMDAxKSB7DQogICAgICB2YWx1ZSA8LSAiKioqIg0KICAgIH0NCiAgICByZXR1cm4odmFsdWUpDQogIH0NCiAgV1Rlc3RGcmFtZSA8LSBhcy5kYXRhLmZyYW1lKGlucHV0JHJlc3VsdCRjaGkyKSAlPiUNCiAgICByZW5hbWUoIlJlc3VsdHMiID0gImlucHV0JHJlc3VsdCRjaGkyIikgDQogIFdUZXN0RnJhbWVbImNoaTIiLF0gPC0gcm91bmQoV1Rlc3RGcmFtZVsiY2hpMiIsXSwyKQ0KICByb3duYW1lcyhXVGVzdEZyYW1lKVtyb3duYW1lcyhXVGVzdEZyYW1lKSA9PSAiY2hpMiJdIDwtDQogICAgIkNoaSBTcXVhcmVkIg0KICBXVGVzdEZyYW1lWyJkZiIsXSA8LSByb3VuZChXVGVzdEZyYW1lWyJkZiIsXSwyKQ0KICByb3duYW1lcyhXVGVzdEZyYW1lKVtyb3duYW1lcyhXVGVzdEZyYW1lKSA9PSAiZGYiXSA8LQ0KICAgICJEZWdyZWVzIG9mIEZyZWVkb20iDQogIFdUZXN0RnJhbWVbIlAiLF0gPC0gcm91bmQoV1Rlc3RGcmFtZVsiUCIsXSw0KQ0KICByb3duYW1lcyhXVGVzdEZyYW1lKVtyb3duYW1lcyhXVGVzdEZyYW1lKSA9PSAiUCJdIDwtICJwIFZhbHVlIg0KICBXVGVzdEZyYW1lIDwtIHJvd25hbWVzX3RvX2NvbHVtbihXVGVzdEZyYW1lLCAiRWxlbWVudHMiKQ0KICBXVGVzdEZyYW1lWywgIiAiXSA8LSBOQQ0KICBmb3JtYXR0YWJsZShXVGVzdEZyYW1lLA0KICAgICAgICAgICAgICBhbGlnbiA9IGMoImwiLCByZXAoInIiLCBOQ09MKFdUZXN0RnJhbWUpIC0gMSkpLA0KICAgICAgICAgICAgICBsaXN0KA0KICAgICAgICAgICAgICAgIGBFbGVtZW50c2AgPSBmb3JtYXR0ZXIoInNwYW4iLCBzdHlsZSA9IH4gc3R5bGUoDQogICAgICAgICAgICAgICAgICBjb2xvciA9ICJncmV5IiwgZm9udC53ZWlnaHQgPSAiYm9sZCINCiAgICAgICAgICAgICAgICApKSwNCiAgICAgICAgICAgICAgICBgIGAgPSBmb3JtYXR0ZXIoDQogICAgICAgICAgICAgICAgICAic3BhbiIsDQogICAgICAgICAgICAgICAgICBzdHlsZSA9IH4gc3R5bGUoY29sb3IgPSBpZmVsc2UoYEVsZW1lbnRzYCA9PSAicCBWYWx1ZSIsICIiLCAiIikpLA0KICAgICAgICAgICAgICAgICAgfiBpY29udGV4dCgNCiAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGBFbGVtZW50c2AgPT0gInAgVmFsdWUiLCAiIiwgIiIpLA0KICAgICAgICAgICAgICAgICAgICBpZmVsc2UoDQogICAgICAgICAgICAgICAgICAgICAgYEVsZW1lbnRzYCA9PSAicCBWYWx1ZSIsDQogICAgICAgICAgICAgICAgICAgICAgc2FwcGx5KGBSZXN1bHRzYCwgZnVuY3Rpb24oeCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHBWYWxFdmFsKHgpKSwNCiAgICAgICAgICAgICAgICAgICAgICAiIg0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICApKQ0KfQ0KDQp1bml2YXJpYXRlX3JlZ3Jlc3Npb24gPC0gZnVuY3Rpb24ob3V0Y29tZSwgaW5wdXQsIGRhdGEsIGNvcnJlbGF0aW9uID0gRkFMU0UsIHN1bW1hcnkgPSBUUlVFKSB7DQogIGlmKCFjb3JyZWxhdGlvbikgew0KICAgIFJlZ3Jlc3MgPC0NCiAgICAgIGdsbShvdXRjb21lIH4gaW5wdXQsDQogICAgICAgICAgZGF0YSA9IGRhdGEsDQogICAgICAgICAgZmFtaWx5ID0gImJpbm9taWFsIikNCiAgICANCiAgICB0ZXN0UCA8LQ0KICAgICAgYXMuZGF0YS5mcmFtZShjYmluZChjYmluZChPUiA9IGNvZWYoUmVncmVzcyksIGNvbmZpbnQoUmVncmVzcykpLCBwID0gcm91bmQoY29lZihzdW1tYXJ5KFJlZ3Jlc3MpKVssIDRdLCA0KSkpICU+JQ0KICAgICAgcm93bmFtZXNfdG9fY29sdW1uKCJWYXJpYWJsZSIpICU+JQ0KICAgICAgbXV0YXRlKFRpdGxlID0gaWZlbHNlKA0KICAgICAgICBWYXJpYWJsZSAhPSAiKEludGVyY2VwdCkiLA0KICAgICAgICBzdWJzdHJpbmcoVmFyaWFibGUsIG5jaGFyKCJJbnB1dCAiKSksDQogICAgICAgIFZhcmlhYmxlDQogICAgICApKSAlPiUNCiAgICAgIHNlbGVjdChUaXRsZSwgT1IsICIyLjUgJSIsICI5Ny41ICUiLCBwKSAlPiUNCiAgICAgIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAiVGl0bGUiKQ0KICAgIA0KICAgIHN1bW1hcnlfdGFiIDwtIHN1bW1hcnlfdGFibGUoUmVncmVzcywgaW5wdXQpDQogICAgDQogICAgd1Rlc3QgPC0NCiAgICAgIHdhbGQudGVzdCgNCiAgICAgICAgYiA9IGNvZWYoUmVncmVzcyksDQogICAgICAgIFNpZ21hID0gdmNvdihSZWdyZXNzKSwNCiAgICAgICAgVGVybXMgPSAyOm5sZXZlbHMoaW5wdXQpDQogICAgICApDQogICAgDQogICAgcmVncmVzc19UYWIgPC0gcmVncmVzc190YWJsZSh0ZXN0UCkNCiAgICByZWdyZXNzX3dhbGQgPC0gd2FsZF90YWJsZSh3VGVzdCkNCiAgICANCiAgICBvdXRwdXQgPC0gbGlzdChyZWdyZXNzX1RhYiwgcmVncmVzc193YWxkLCB0ZXN0UCwgc3VtbWFyeV90YWIsIHdUZXN0LCBSZWdyZXNzKQ0KICB9ZWxzZXsNCiAgICAjTWV0aG9kIGZvciBjb21wdXRpbmcgYSBmdWxsIGNyb3NzIHRhYmxlIHdpdGggcCBzY29yZXMgLT4gRmFyIE1vcmUgUHJvY2Vzc29yIEludGVuc2l2ZQ0KICAgIGlucHV0IDwtIGZhY3RvcihpbnB1dCkNCiAgICBvZGRzX3RhYmxlIDwtIE5VTEwNCiAgICBwdmFsX3RhYmxlIDwtIE5VTEwNCiAgICBmb3IodmVjIGluIGxldmVscyhpbnB1dCkpew0KICAgICAgaW5wdXQgPC0gcmVsZXZlbChpbnB1dCwgcmVmID0gdmVjKQ0KICAgICAgUmVncmVzcyA8LSBnbG0oTE9TX091dGNvbWUgfiBpbnB1dCwgZGF0YSA9IE1lcmdlZF9NZWQsIGZhbWlseSA9ICJiaW5vbWlhbCIpDQogICAgICAjIGFzLmRhdGEuZnJhbWUoY2JpbmQoY2JpbmQoT1IgPSBleHAoY29lZihSZWdyZXNzKSksIGV4cChjb25maW50KFJlZ3Jlc3MpKSksIHAgPSByb3VuZChjb2VmKHN1bW1hcnkoUmVncmVzcykpWywgNF0sIDQpKSkNCiAgICAgIHZhcl9sYWJlbHMgPC0gc3Vic3RyaW5nKG5hbWVzKGNvZWYoUmVncmVzcykpWy0xXSwgbmNoYXIoIklucHV0ICIpKQ0KICAgICAgZXN0aW1hdGUgPC0gcm91bmQoZXhwKGNvZWYoUmVncmVzcykpLCAyKVstMV0gI1JlbW92ZXMgSW50ZXJjZXB0DQogICAgICANCiAgICAgIGNvbmZzIDwtIHN1cHByZXNzTWVzc2FnZXMocm91bmQoZXhwKGNvbmZpbnQoUmVncmVzcykpLCAyKSlbLTEsXSAjUmVtb3ZlcyBJbnRlcmNlcHQNCiAgICAgIA0KICAgICAgUm9vdCA8LSBjYmluZCgxKSAjR2VuZXJhdGVzIGEgcmVmZXJlbmNlIHJvdyBmb3IgdGhlIHZhcmlhYmxlIG9mIGludGVyZXN0DQogICAgICBjb2xuYW1lcyhSb290KSA8LSBwYXN0ZSh2ZWMpDQogICAgICByb3duYW1lcyhSb290KSA8LSBwYXN0ZSh2ZWMpDQogICAgICBSb290IDwtIGFzLmRhdGEuZnJhbWUoUm9vdCkNCiAgICAgIA0KICAgICAgT1IgPC0gY2JpbmQocGFzdGUoZXN0aW1hdGUsICIoIiwgY29uZnNbLDFdLCAiLSIsIGNvbmZzWywyXSwgIikiLCBzZXAgPSAiIikpDQogICAgICBjb2xuYW1lcyhPUikgPC0gcGFzdGUodmVjKQ0KICAgICAgcm93bmFtZXMoT1IpIDwtIHZhcl9sYWJlbHMNCiAgICAgIE9SIDwtIGFzLmRhdGEuZnJhbWUoT1IpDQogICAgICANCiAgICAgIE9SIDwtIGFzLmRhdGEuZnJhbWUodChyYmluZChSb290LCBPUikpKSAjVHJhbnNwb3NlcyB0aGUgbWF0cml4IHRvIGVuYWJsZSBjb2x1bW4gbWF0Y2hpbmcNCiAgICAgIGlmKGlzLm51bGwob2Rkc190YWJsZSkpew0KICAgICAgICBvZGRzX3RhYmxlIDwtIE9SICNDb25zdHJ1Y3RzIA0KICAgICAgfWVsc2V7DQogICAgICAgIG9kZHNfdGFibGUgPC0gcmJpbmQob2Rkc190YWJsZSwgT1IpICNBZGRzIG5ldyByYXRpbyB0YWJsZQ0KICAgICAgfQ0KICAgICAgDQogICAgICBSb290IDwtIGNiaW5kKDIpICNHZW5lcmF0ZXMgYSByZWZlcmVuY2Ugcm93IGZvciB0aGUgdmFyaWFibGUgb2YgaW50ZXJlc3QNCiAgICAgIGNvbG5hbWVzKFJvb3QpIDwtIHBhc3RlKHZlYykNCiAgICAgIHJvd25hbWVzKFJvb3QpIDwtIHBhc3RlKHZlYykNCiAgICAgIFJvb3QgPC0gYXMuZGF0YS5mcmFtZShSb290KQ0KICAgICAgUm9vdA0KICAgICAgcFZhbCA8LSBjYmluZChyb3VuZChjb2VmKHN1bW1hcnkoUmVncmVzcykpWywgNF0sIDQpWy0xXSkNCiAgICAgIGNvbG5hbWVzKHBWYWwpIDwtIHBhc3RlKHZlYykNCiAgICAgIHJvd25hbWVzKHBWYWwpIDwtIHZhcl9sYWJlbHMNCiAgICAgIHBWYWwgPC0gYXMuZGF0YS5mcmFtZShwVmFsKQ0KICAgICAgDQogICAgICBwVmFsIDwtIGFzLmRhdGEuZnJhbWUodChyYmluZChSb290LCBwVmFsKSkpICNUcmFuc3Bvc2VzIHRoZSBtYXRyaXggdG8gZW5hYmxlIGNvbHVtbiBtYXRjaGluZw0KICAgICAgDQogICAgICBpZihpcy5udWxsKHB2YWxfdGFibGUpKXsNCiAgICAgICAgcHZhbF90YWJsZSA8LSBwVmFsICNDb25zdHJ1Y3RzIA0KICAgICAgfWVsc2V7DQogICAgICAgIHB2YWxfdGFibGUgPC0gcmJpbmQocHZhbF90YWJsZSwgcFZhbCkgI0FkZHMgbmV3IHJhdGlvIHRhYmxlDQogICAgICB9DQogICAgfQ0KICAgIA0KICAgIG9kZHNfdGFibGUgPC0gYXMuZGF0YS5mcmFtZSh0KG9kZHNfdGFibGUpKQ0KICAgIHB2YWxfdGFibGUgPC0gYXMuZGF0YS5mcmFtZSh0KHB2YWxfdGFibGUpKQ0KICAgIA0KICAgIGlmKHN1bW1hcnkgPT0gVFJVRSkgew0KICAgICAgc3VtbWFyeV90YWIgPC0gc3VtbWFyeV90YWJsZShSZWdyZXNzLCBpbnB1dCkNCiAgICB9IGVsc2V7DQogICAgICBzdW1tYXJ5X3RhYiA8LSBOVUxMDQogICAgfQ0KICAgIA0KICAgIHdUZXN0IDwtDQogICAgICB3YWxkLnRlc3QoDQogICAgICAgIGIgPSBjb2VmKFJlZ3Jlc3MpLA0KICAgICAgICBTaWdtYSA9IHZjb3YoUmVncmVzcyksDQogICAgICAgIFRlcm1zID0gMjpubGV2ZWxzKGlucHV0KQ0KICAgICAgKQ0KICAgIA0KICAgIHJlZ3Jlc3Nfd2FsZCA8LSB3YWxkX3RhYmxlKHdUZXN0KQ0KICAgIA0KICAgIG91dHB1dCA8LSBsaXN0KG9kZHNfdGFibGUsIHJlZ3Jlc3Nfd2FsZCwgcHZhbF90YWJsZSwgc3VtbWFyeV90YWIsIHdUZXN0LCBSZWdyZXNzKQ0KICB9DQogIA0KICByZXR1cm4ob3V0cHV0KQ0KfSAgDQoNCnN1bW1hcnlfdGFibGUgPC0gZnVuY3Rpb24oaW5wdXRNb2QsIHZhcmlhYmxlKSB7DQogIHBWYWxFdmFsIDwtIGZ1bmN0aW9uKHgpIHsNCiAgICB2YWx1ZSA8LSAiIg0KICAgIGlmICh4IDwgMC4xKSB7DQogICAgICB2YWx1ZSA8LSAiLiINCiAgICB9DQogICAgaWYgKHggPCAwLjA1KSB7DQogICAgICB2YWx1ZSA8LSAiKiINCiAgICB9DQogICAgaWYgKHggPCAwLjAxKSB7DQogICAgICB2YWx1ZSA8LSAiKioiDQogICAgfQ0KICAgIGlmICh4IDwgMC4wMDEpIHsNCiAgICAgIHZhbHVlIDwtICIqKioiDQogICAgfQ0KICAgIHJldHVybih2YWx1ZSkNCiAgfQ0KICBpbnB1dCA8LSBzdW1tYXJ5KGlucHV0TW9kKQ0KICANCiAgTnVsbF9EZXZpYW5jZSA8LSBpbnB1dCRudWxsLmRldmlhbmNlDQogIE51bGxfREYgPC0gaW5wdXQkZGYubnVsbA0KICBSZXNfRGV2aWFuY2UgPC0gaW5wdXQkZGV2aWFuY2UNCiAgUmVzX0RGIDwtIGlucHV0JGRmLnJlc2lkdWFsDQogIEFJQyA8LSBpbnB1dCRhaWMNCiAgDQogIGhvc2xlbSA8LSBzdXBwcmVzc01lc3NhZ2VzKGhvc2xlbS50ZXN0KHZhcmlhYmxlLCBmaXR0ZWQoaW5wdXRNb2QpKSkNCiAgaG9zbGVtX2NoaSA8LSBob3NsZW0kc3RhdGlzdGljDQogIGhvc2xlbV9kZiA8LSBob3NsZW0kcGFyYW1ldGVyDQogIGhvc2xlbV9wIDwtIGhvc2xlbSRwLnZhbHVlDQogIA0KICBzdW1tYXJ5X3RhYiA8LSBOVUxMDQogIHN1bW1hcnlfdGFiIDwtDQogICAgcmJpbmQoc3VtbWFyeV90YWIsICJOdWxsIERldmlhbmNlIiA9IE51bGxfRGV2aWFuY2UpICU+JQ0KICAgIHJiaW5kKCJOdWxsIERlZ3JlZXMgb2YgRnJlZWRvbSIgPSBOdWxsX0RGKSAlPiUNCiAgICByYmluZCgiUmVzaWR1YWwgRGV2aWFuY2UiID0gUmVzX0RldmlhbmNlKSAlPiUNCiAgICByYmluZCgiUmVzaWR1YWwgRGVncmVlcyBvZiBGcmVlZG9tIiA9IFJlc19ERikgJT4lDQogICAgcmJpbmQoIkFrYWlrZSBJbmZvcm1hdGlvbiBDcml0ZXJpb24gKEFJQykiID0gQUlDKSAlPiUNCiAgICByYmluZCgiSG9zbGVtIFRlc3QgQ2hpLVNxdWFyZWQiID0gaG9zbGVtX2NoaSkgJT4lDQogICAgcmJpbmQoIkhvc2xlbSBEZWdyZWVzIG9mIEZyZWVkb20iID0gaG9zbGVtX2RmKSAlPiUNCiAgICByYmluZCgiSG9zbGVtIHAgVmFsdWUiID0gaG9zbGVtX3ApICU+JQ0KICAgIGFzLmRhdGEuZnJhbWUoKSAlPiUNCiAgICByb3duYW1lc190b19jb2x1bW4oIkVsZW1lbnRzIikgJT4lDQogICAgcmVuYW1lKCJSZXN1bHRzIiA9ICJYLXNxdWFyZWQiKQ0KICANCiAgc3VtbWFyeV90YWJbLCAiICJdIDwtIE5BDQogIA0KICBmb3JtYXR0YWJsZShzdW1tYXJ5X3RhYiwNCiAgICAgICAgICAgICAgYWxpZ24gPSBjKCJsIiwgcmVwKCJyIiwgTkNPTChzdW1tYXJ5X3RhYikgLSAxKSksDQogICAgICAgICAgICAgIGxpc3QoDQogICAgICAgICAgICAgICAgYEVsZW1lbnRzYCA9IGZvcm1hdHRlcigic3BhbiIsIHN0eWxlID0gfiBzdHlsZSgNCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImdyZXkiLCBmb250LndlaWdodCA9ICJib2xkIg0KICAgICAgICAgICAgICAgICkpLA0KICAgICAgICAgICAgICAgIGAgYCA9IGZvcm1hdHRlcigNCiAgICAgICAgICAgICAgICAgICJzcGFuIiwNCiAgICAgICAgICAgICAgICAgIHN0eWxlID0gfiBzdHlsZShjb2xvciA9IGlmZWxzZShgRWxlbWVudHNgID09ICJwIFZhbHVlIiwgIiIsICIiKSksDQogICAgICAgICAgICAgICAgICB+IGljb250ZXh0KA0KICAgICAgICAgICAgICAgICAgICBpZmVsc2UoYEVsZW1lbnRzYCA9PSAiSG9zbGVtIHAgVmFsdWUiLCAiIiwgIiIpLA0KICAgICAgICAgICAgICAgICAgICBpZmVsc2UoDQogICAgICAgICAgICAgICAgICAgICAgYEVsZW1lbnRzYCA9PSAiSG9zbGVtIHAgVmFsdWUiLA0KICAgICAgICAgICAgICAgICAgICAgIHNhcHBseShgUmVzdWx0c2AsIGZ1bmN0aW9uKHgpDQogICAgICAgICAgICAgICAgICAgICAgICBwVmFsRXZhbCh4KSksDQogICAgICAgICAgICAgICAgICAgICAgIiINCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgKSkNCn0NCg0Kb2Rkc19tYXRyaXggPC0gZnVuY3Rpb24oaW5wdXRNYXRyaXgsIHB2YWxNYXRyaXgsIHdpZHRoID0gMTAwLCBoZWlnaHQgPSA1MCkgew0KICBwVmFsQ29sb3VyIDwtIGZ1bmN0aW9uKHgsIHkpIHsNCiAgICBjb2xvcl9ibG9jayA8LSBmdW5jdGlvbihjb2xvdXIpIHsNCiAgICAgIHJlcGxhY2VCbG9jayA8LSBmdW5jdGlvbih0ZXh0KSB7DQogICAgICAgIG91dHB1dCA8LSAiIg0KICAgICAgICBpZiAodGV4dCA9PSAiMSIpIHsNCiAgICAgICAgICBvdXRwdXQgPC0gIjEiDQogICAgICAgIH0gZWxzZXsNCiAgICAgICAgICBvdXRwdXQgPC0NCiAgICAgICAgICAgIGxpc3QoDQogICAgICAgICAgICAgIHN1YnN0cmluZyh0ZXh0LCAxLCByZWdleHByKCdcXCgnLCB0ZXh0KVsxXSAtIDEpLA0KICAgICAgICAgICAgICB0YWcoImRpdiIsICIiKSwNCiAgICAgICAgICAgICAgc3Vic3RyaW5nKHRleHQsIHJlZ2V4cHIoJ1xcKCcsIHRleHQpWzFdKQ0KICAgICAgICAgICAgKQ0KICAgICAgICB9DQogICAgICAgIHJldHVybihvdXRwdXQpDQogICAgICB9DQogICAgICBmb3JtYXR0ZXIoDQogICAgICAgICJzcGFuIiwNCiAgICAgICAgeCB+ICBpY29udGV4dCgiIiwgcmVwbGFjZUJsb2NrKHgpKSwNCiAgICAgICAgc3R5bGUgPSBmdW5jdGlvbih4KSB7DQogICAgICAgICAgaWYgKHggPT0gIjEiKSB7DQogICAgICAgICAgICBzdHlsZSgNCiAgICAgICAgICAgICAgZGlzcGxheSA9ICJ0YWJsZS1jZWxsIiwNCiAgICAgICAgICAgICAgcGFkZGluZyA9IHN1ZmZpeCgwLCAicHgiKSwNCiAgICAgICAgICAgICAgImJvcmRlci1yYWRpdXMiID0gc3VmZml4KDAsICJweCIpLA0KICAgICAgICAgICAgICAiYmFja2dyb3VuZC1jb2xvciIgPSBjc3Njb2xvcihvdmVybGFwX2NvbG91ciksDQogICAgICAgICAgICAgIHdpZHRoID0gc3VmZml4KHdpZHRoLCAicHgiKSwNCiAgICAgICAgICAgICAgaGVpZ2h0ID0gc3VmZml4KGhlaWdodCwgInB4IiksDQogICAgICAgICAgICAgICJ2ZXJ0aWNhbC1hbGlnbiIgPSAibWlkZGxlIiwNCiAgICAgICAgICAgICAgInRleHQtYWxpZ24iID0gImNlbnRlciIsDQogICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIg0KICAgICAgICAgICAgKQ0KICAgICAgICAgIH0gZWxzZXsNCiAgICAgICAgICAgIHN0eWxlKA0KICAgICAgICAgICAgICBkaXNwbGF5ID0gImJsb2NrIiwNCiAgICAgICAgICAgICAgcGFkZGluZyA9IHN1ZmZpeCgwLjQsICJweCIpLA0KICAgICAgICAgICAgICAiYm9yZGVyLXJhZGl1cyIgPSBzdWZmaXgoOCwgInB4IiksDQogICAgICAgICAgICAgICJiYWNrZ3JvdW5kLWNvbG9yIiA9IGNzc2NvbG9yKGNvbG91ciksDQogICAgICAgICAgICAgIHdpZHRoID0gc3VmZml4KHdpZHRoLCAicHgiKSwNCiAgICAgICAgICAgICAgaGVpZ2h0ID0gc3VmZml4KGhlaWdodCwgInB4IiksDQogICAgICAgICAgICAgICJsaW5lLWhlaWdodCIgPSBzdWZmaXgoaGVpZ2h0IC8gMiwgInB4IiksDQogICAgICAgICAgICAgICJ0ZXh0LWFsaWduIiA9ICJjZW50ZXIiDQogICAgICAgICAgICApDQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICApDQogICAgfQ0KICAgIHZhbHVlIDwtIGNvbG9yX2Jsb2NrKCJ0cmFuc3BhcmVudCIpDQogICAgaWYgKHggPCAwLjA1KSB7DQogICAgICB2YWx1ZSA8LSBjb2xvcl9ibG9jayhwdmFsMDUpDQogICAgfQ0KICAgIGlmICh4IDwgMC4wMSkgew0KICAgICAgdmFsdWUgPC0gY29sb3JfYmxvY2socHZhbDAxKQ0KICAgIH0NCiAgICBpZiAoeCA8IDAuMDAxKSB7DQogICAgICB2YWx1ZSA8LSBjb2xvcl9ibG9jayhwdmFsMDAxKQ0KICAgIH0NCiAgICByZXR1cm4odmFsdWUpDQogIH0NCiAgb2Rkc19tYXRyaXggPC0gZm9ybWF0dGFibGUoaW5wdXRNYXRyaXgsIGFsaWduID0gYyhyZXAoImMiLCBOQ09MKGlucHV0TWF0cml4KSkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXBwbHkoMTpucm93KGlucHV0TWF0cml4KSwgZnVuY3Rpb24ocm93X251bSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhcHBseSgxOm5jb2woaW5wdXRNYXRyaXgpLCBmdW5jdGlvbihjb2xfbnVtKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhKGNvbCA9IGNvbF9udW0sIHJvdyA9IHJvd19udW0pIH4gcFZhbENvbG91cihwdmFsTWF0cml4W2NvbF9udW0sIHJvd19udW1dLCB4KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKQ0KICByZXR1cm4ob2Rkc19tYXRyaXgpDQp9DQoNCmdyZWVuX21pbiA8LSAiI2U3ZmZlZSINCmdyZWVuX21heCA8LSAiIzRhYjc2YyINCnJlZF92YWwgPC0gIiNlMDNlNjkiDQpwdmFsMDUgPC0gIiNjNGViZjkiDQpwdmFsMDEgPC0gIiM4OGQyZjIiDQpwdmFsMDAxIDwtICIjNGJiMWU3Ig0Kb3ZlcmxhcF9jb2xvdXIgPC0gIiMzNzQ3NEYiDQpgYGANCiMjIyMgVGhpcyBpcyBhbiBldm9sdmluZyBhbmFseXNpcyBvZiB0aGUgRWxlY3Ryb25pYyBTdXJnaWNhbCBEaXNjaGFyZ2UgRGF0YXNldA0KDQojIyBDb21wbGV0aW9uIEFuYWx5c2lzDQpgYGB7ciBFRCwgZWNobz1GQUxTRX0NCkVEIDwtICBFRCAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUoQWdlX0dyb3VwID0gYWdlX2dyb3VwcyhhZ2UpKQ0KDQpFRCRBZ2VfR3JvdXAgPC0gb3JkZXJlZCgNCiAgRUQkQWdlX0dyb3VwLA0KICBsZXZlbHMgPSBhZ2VfbGlzdA0KKQ0Kc3VwcHJlc3NNZXNzYWdlcygNCk1lcmdlZElDRCA8LSBsZWZ0X2pvaW4oeCA9IERpc2NoYXJnZSwgeSA9IERpYWdub3NpcykgJT4lDQogIGxlZnRfam9pbih4ID0gLiwgeSA9IElDRCkgJT4lDQogIGxlZnRfam9pbih4ID0gLiwgeSA9IElDREJsb2NrKSAlPiUNCiAgbGVmdF9qb2luKHggPSAuLCB5ID0gSUNEQ2hhcCkgJT4lDQogIGxlZnRfam9pbih4ID0gLiwgeSA9IEVEKQ0KKQ0KDQpjb3VudF90YWJsZSA8LSBjb21wbGV0aW9uKE1lcmdlZElDRCkNCg0KY29tcGxldGlvbl9wbG90IDwtDQogIGdncGxvdChkYXRhID0gY291bnRfdGFibGUpICsgZ2VvbV9jb2wobWFwcGluZyA9IGFlcyh4ID0gdmFyaWFibGUsIHkgPSBmcmFjdGlvbiksIGZpbGwgPSAnZG9kZ2VyYmx1ZScpICsNCiAgbGFicyh0aXRsZSA9ICJSZWNvcmQgQ29tcGxldGlvbiBGcmFjdGlvbiIsIHggPSAiUmVjb3JkcyIsIHkgPSAiQ29tcGxldGlvbiBGcmFjdGlvbiIpICsgY29vcmRfZmxpcCgpICsgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gImJsYWNrIikpDQpgYGANCiMjIyBPdmVyYWxsIENvbXBsZXRpb24gRnJhY3Rpb24NCmByIGdncGxvdGx5KGNvbXBsZXRpb25fcGxvdCwgaGVpZ2h0ID0gMTAwMClgDQoNCiMjIFBhdGllbnQgU2VhcmNoaW5nDQojIyMgRGlzdHJpYnV0aW9uIG9mIENvbW1vbiBMYXN0IE5hbWVzDQpgYGB7ciBTZWFyY2gsIGVjaG89RkFMU0UsIGZpZy5hbGlnbiA9ICJjZW50ZXIifQ0KTGFzdF9Db3VudCA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKEVEJGxhc3ROYW1lKSkNCg0KTGFzdF9Cb3ggPC0gTGFzdF9Db3VudCAlPiUNCiAgZmlsdGVyKEZyZXEgPiAxMCkgJT4lDQogIHNlbGVjdChGcmVxKSAlPiUNCiAgYm94cGxvdCgNCiAgICAuLA0KICAgIG1haW4gPSAiRGlzdHJpYnV0aW9uIG9mIExhc3QgTmFtZXMgYXBwZWFyaW5nIG1vcmUgdGhhbiAxMCB0aW1lcyBpbiBFRCIsDQogICAgeGxhYiA9ICJGcmVxdWVuY3kiLA0KICAgIHlsYWIgPSAiTGFzdCBOYW1lcyIsDQogICAgY29sID0gInJlZCIsDQogICAgYm9yZGVyID0gImJsYWNrIiwNCiAgICBob3Jpem9udGFsID0gVFJVRSwNCiAgICBub3RjaCA9IEZBTFNFDQogICkNCg0KTGFzdF9TdHJpcCA8LUxhc3RfQ291bnQgJT4lDQogIGZpbHRlcihGcmVxID4gMTApICU+JQ0KICBzZWxlY3QoRnJlcSkgJT4lDQogIHN0cmlwY2hhcnQoDQogICAgLiwNCiAgICB4bGFiID0gIkZyZXF1ZW5jeSIsDQogICAgeWxhYiA9ICJMYXN0IE5hbWVzIiwNCiAgICBtZXRob2QgPSAiaml0dGVyIiwNCiAgICBjb2wgPSAiYmxhY2siDQogICkNCmBgYA0KIyMjIExhc3QgTmFtZSBGcmVxdWVuY3kNCmBgYHtyIFNlYXJjaCAyLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ24gPSAiY2VudGVyIn0NCg0KaGlzdChMYXN0X0NvdW50JEZyZXEsIG1haW4gPSAiSGlzdG9ncmFtIG9mIExhc3QgTmFtZXMiLCB4bGFiID0gIkxhc3QgTmFtZSBPY2N1cmVuY2UiKQ0KDQpMYXN0X0NvdW50JEZyZXEgJT4lDQogIHRhYmxlKCkgJT4lDQogIGFzLnZlY3RvcigpICU+JQ0KICBjdW1zdW0oKSAlPiUNCiAgYmFycGxvdCgpDQpgYGANCg0KYGBge3IgU2VhcmNoIDMsIGVjaG89RkFMU0V9DQojR3JvdXBpbmcgYnkgRnVsbCBTdXJuYW1lICYgRnVsbCBOYW1lDQpjb3VudF9uYW1lcyAgPC0gRUQgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgZ3JvdXBfYnkobGFzdE5hbWUsIGZpcnN0TmFtZSkgJT4lDQogIGNvdW50KCkgJT4lDQogIHJlbmFtZShDb3VudCA9IG4pDQoNCiNHcm91cGluZyBieSBGdWxsIFN1cm5hbWUgJiBGaXJzdCBJbml0aWFsDQpjb3VudF9pbml0aWFsIDwtIEVEICU+JQ0KICBtdXRhdGUoaW5pdGlhbHMgPSBzdWJzdHIoZmlyc3ROYW1lLCBzdGFydCA9IDEsIHN0b3AgPSAxKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgZ3JvdXBfYnkobGFzdE5hbWUsIGluaXRpYWxzKSAlPiUNCiAgY291bnQoKSAlPiUNCiAgcmVuYW1lKENvdW50ID0gbikNCg0KZnVsbF90YWIgPC0gU3VtbWFyeV9UYWJsZShjb3VudF9uYW1lcyRDb3VudCkNCmluaXRpYWxfdGFiIDwtIFN1bW1hcnlfVGFibGUoY291bnRfaW5pdGlhbCRDb3VudCkNCmBgYA0KIyMjIEZ1bGwgRmlyc3QgTmFtZSAmIExhc3QgTmFtZSBTZWFyY2gNCmByIGZ1bGxfdGFiYA0KIyMjIEZpcnN0IEluaXRpYWwgJiBMYXN0IE5hbWUgU2VhcmNoDQpgciBpbml0aWFsX3RhYmANCg0KIyMgRGVtb2dyYXBoaWMgQW5hbHlzaXMNCmBgYHtyIERlbW9ncmFwaGljLCBlY2hvPUZBTFNFfQ0KI0RlbW9ncmFwaGljIEdyb3VwaW5nDQpFdGhuaWNpdHlfQmFyIDwtICANCiAgZ2dwbG90KEVELCBhZXMoeCA9IGV0aG5pY2l0eSkpICsgZ2VvbV9iYXIoZmlsbCA9ICdyZWQnKSArIGdlb21fdGV4dCgNCiAgICBzdGF0ID0gJ2NvdW50JywNCiAgICBhZXMobGFiZWwgPSAuLmNvdW50Li4pLA0KICAgIHZqdXN0ID0gLTAuMywNCiAgICBzaXplID0gMy41DQogICkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gcGFzdGUoDQogICAgICAiRGlzdHJpYnV0aW9uIG9mIEV0aG5pY2l0aWVzIGluIEVEIChuID0gIiwNCiAgICAgIG5yb3coRUQpLA0KICAgICAgIikiLA0KICAgICAgc2VwID0gIiINCiAgICApLA0KICAgIHkgPSAiQ291bnQiLA0KICAgIHggPSAiRXRobmljaXRpZXMiDQogICkgKyB0aGVtZSgNCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSAiYmxhY2siKQ0KICApDQoNCkdlbmRlcl9CYXIgPC0NCiAgZ2dwbG90KEVELCBhZXMoeCA9IGdlbmRlcikpICsgZ2VvbV9iYXIoZmlsbCA9ICdyZWQnKSArIGdlb21fdGV4dCgNCiAgICBzdGF0ID0gJ2NvdW50JywNCiAgICBhZXMobGFiZWwgPSAuLmNvdW50Li4pLA0KICAgIHZqdXN0ID0gLTAuMywNCiAgICBzaXplID0gMy41DQogICkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gcGFzdGUoDQogICAgICAiRGlzdHJpYnV0aW9uIG9mIFNleCBpbiBFRCAobiA9ICIsDQogICAgICBucm93KEVEKSwNCiAgICAgICIpIiwNCiAgICAgIHNlcCA9ICIiDQogICAgKSwNCiAgICB5ID0gIkNvdW50IiwNCiAgICB4ID0gIlNleCINCiAgKSArIHRoZW1lKA0KICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJibGFjayIpDQogICkNCg0KRXRobmljaXR5X0dlbmRlciA8LSBnZ3Bsb3QoRUQsIGFlcyh4ID0gZXRobmljaXR5LCBmaWxsID0gZ2VuZGVyKSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgICBsYWJzKA0KICAgICAgdGl0bGUgPSAiRXRobmljaXR5ICYgR2VuZGVyIERpdmlzaW9ucyIsDQogICAgICB4ID0gIkV0aG5pY2l0aWVzIiwNCiAgICAgIHkgPSAiQ291bnQiLA0KICAgICAgZmlsbCA9ICJHZW5kZXIiDQopKyB0aGVtZSgNCiAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gImJsYWNrIikNCikNCg0KQWdlX0JhciA8LQ0KICBnZ3Bsb3QoRUQsIGFlcyh4ID0gQWdlX0dyb3VwKSkgKyBnZW9tX2JhcihmaWxsID0gJ3JlZCcpICsgZ2VvbV90ZXh0KA0KICAgIHN0YXQgPSAnY291bnQnLA0KICAgIGFlcyhsYWJlbCA9IC4uY291bnQuLiksDQogICAgdmp1c3QgPSAtMC4zLA0KICAgIHNpemUgPSAzLjUNCiAgKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSBwYXN0ZSgNCiAgICAgICJEaXN0cmlidXRpb24gb2YgQWdlIEdyb3VwcyBpbiBFRCAobiA9ICIsDQogICAgICBucm93KEVEKSwNCiAgICAgICIpIiwNCiAgICAgIHNlcCA9ICIiDQogICAgKSwNCiAgICB5ID0gIkNvdW50IiwNCiAgICB4ID0gIkFnZSBHcm91cHMiDQogICkgKyB0aGVtZSgNCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSAiYmxhY2siKQ0KICApICsgY29vcmRfZmxpcCgpDQoNClJhY2VfQ0kgPC0gTXVsdGlfQ0koRUQkZXRobmljaXR5KSAlPiUNCiAgcmVuYW1lKCJFdGhuaWNpdHkiID0gRmllbGRzKQ0KUmFjZV9UYWIgPC0gZm9ybWF0dGFibGUoDQogIFJhY2VfQ0ksDQogIGFsaWduID0gYygibCIsIHJlcCgiciIsIE5DT0woUmFjZV9DSSkgLSAxKSksDQogIGxpc3QoDQogICAgIkV0aG5pY2l0eSIgPSBmb3JtYXR0ZXIoInNwYW4iLCBzdHlsZSA9IH4gc3R5bGUoDQogICAgICBjb2xvciA9ICJHcmV5IiwgZm9udC53ZWlnaHQgPSAiYm9sZCINCiAgICApKSwNCiAgICAiUGVyY2VudGFnZSAoJSkiID0gY29sb3JfdGlsZShncmVlbl9taW4sIGdyZWVuX21heCkNCiAgKQ0KKQ0KDQpHZW5kZXJfQ0kgPC0gTXVsdGlfQ0koRUQkZ2VuZGVyKSAlPiUNCiAgcmVuYW1lKCJHZW5kZXIiID0gRmllbGRzKQ0KR2VuZGVyX1RhYiA8LSBmb3JtYXR0YWJsZSgNCiAgR2VuZGVyX0NJLA0KICBhbGlnbiA9IGMoImwiLCByZXAoInIiLCBOQ09MKEdlbmRlcl9DSSkgLSAxKSksDQogIGxpc3QoDQogICAgIkdlbmRlciIgPSBmb3JtYXR0ZXIoInNwYW4iLCBzdHlsZSA9IH4gc3R5bGUoDQogICAgICBjb2xvciA9ICJHcmV5IiwgZm9udC53ZWlnaHQgPSAiYm9sZCINCiAgICApKSwNCiAgICAiUGVyY2VudGFnZSAoJSkiID0gY29sb3JfdGlsZShncmVlbl9taW4sIGdyZWVuX21heCkNCiAgKQ0KKQ0KDQpBZ2VfQ0kgPC0gTXVsdGlfQ0koRUQkQWdlX0dyb3VwKSAlPiUNCiAgcmVuYW1lKCJBZ2UgR3JvdXAiID0gRmllbGRzKQ0KQWdlX1RhYiA8LSBmb3JtYXR0YWJsZSgNCiAgQWdlX0NJLA0KICBhbGlnbiA9IGMoImwiLCByZXAoInIiLCBOQ09MKEFnZV9DSSkgLSAxKSksDQogIGxpc3QoDQogICAgIkFnZSBHcm91cCIgPSBmb3JtYXR0ZXIoInNwYW4iLCBzdHlsZSA9IH4gc3R5bGUoDQogICAgICBjb2xvciA9ICJHcmV5IiwgZm9udC53ZWlnaHQgPSAiYm9sZCINCiAgICApKSwNCiAgICAiUGVyY2VudGFnZSAoJSkiID0gY29sb3JfdGlsZShncmVlbl9taW4sIGdyZWVuX21heCkNCiAgKQ0KKQ0KYGBgDQojIyMgRXRobmljaXR5IA0KYHIgZ2dwbG90bHkoRXRobmljaXR5X0JhcilgDQpgciBSYWNlX1RhYmANCiMjIyBTZXgNCmByIGdncGxvdGx5KEdlbmRlcl9CYXIpYA0KYHIgR2VuZGVyX1RhYmAgDQoNCmByIGdncGxvdGx5KEV0aG5pY2l0eV9HZW5kZXIpYA0KDQojIyMgQWdlIEdyb3VwDQpgciBnZ3Bsb3RseShBZ2VfQmFyKWANCmByIEFnZV9UYWJgDQoNCiMjIExlbmd0aCBvZiBTdGF5IEFuYWx5c2lzDQpgYGB7ciBMZW5ndGggb2YgU3RheSwgZWNobz1GQUxTRSwgZmlnLmFsaWduID0gImNlbnRlciJ9DQojTGVuZ3RoIG9mIFN0YXkgQW5hbHlzaXMNCkxPU1RhYiA8LSBEaXNjaGFyZ2UgJT4lDQogIGZpbHRlcihkaXNjaGFyZ2VEYXRlID4gYXMuRGF0ZSgiMjAxNi8xMS8wMSIpLA0KICAgICAgICAgZGF0ZU9mQWRtaXNzaW9uID4gYXMuRGF0ZSgiMjAxNi8xMS8wMSIpKSAlPiUNCiAgbXV0YXRlKA0KICAgIE1vbnRoID0gbW9udGgoc3RhcnRUaW1lKSwNCiAgICBZZWFyID0geWVhcihzdGFydFRpbWUpLA0KICAgIExPUyA9IGFzLm51bWVyaWMoYXMuRGF0ZShkaXNjaGFyZ2VEYXRlKSAtIGFzLkRhdGUoZGF0ZU9mQWRtaXNzaW9uKSkNCiAgKSAlPiUNCiAgZmlsdGVyKExPUyA+PSAwKQ0KDQpMT1NUYWIgJT4lDQogIHNlbGVjdChMT1MpICU+JQ0KICBib3hwbG90KA0KICAgIC4sDQogICAgbWFpbiA9IHBhc3RlKCJEaXN0cmlidXRpb24gb2YgTGVuZ3RoIG9mIFN0YXkgKExPUykgKG4gPSAiLCBucm93KExPU1RhYiksICIpIiwgc2VwID0NCiAgICAgICAgICAgICAgICAgICAiIiksDQogICAgeGxhYiA9ICJEYXlzIiwNCiAgICB5bGFiID0gIkxPUyIsDQogICAgY29sID0gInJlZCIsDQogICAgYm9yZGVyID0gImJsYWNrIiwNCiAgICBob3Jpem9udGFsID0gVFJVRSwNCiAgICBub3RjaCA9IEZBTFNFDQogICkNCg0KTE9TVGFiICU+JQ0KICBzZWxlY3QoTE9TKSAlPiUNCiAgc3RyaXBjaGFydCgNCiAgICAuLA0KICAgIHhsYWIgPSAiRGF5cyIsDQogICAgeWxhYiA9ICJMT1MiLA0KICAgIG1ldGhvZCA9ICJqaXR0ZXIiLA0KICAgIGNvbCA9ICJibGFjayINCiAgKQ0KYGBgDQoNCmBgYHtyIExlbmd0aCBvZiBTdGF5IDIsIGVjaG89RkFMU0V9DQpMT1NTdW1tYXJ5IDwtIERhdGFTdW1tYXJ5KExPU1RhYiRMT1MpDQpvdXRsaWVyIDwtICByb3VuZCgxMDAgKiBucm93KGZpbHRlcihMT1NUYWIsIG91dGxpZXJUZXN0KExPUywgTE9TU3VtbWFyeSkpKSAvIG5yb3coTE9TVGFiKSwgMikNCmBgYA0KYCBgciBvdXRsaWVyYCUgYCBvZiBwYXRpZW50J3Mgd2VyZSBhc3Nlc3NlZCB0byBoYXZlIG91dGxpZXIgbGVuZ3RoIG9mIHN0YXlzLiBUaGlzIHdhcyBhc3Nlc3NlZCBieSBtZWFucyBvZiBhIGN1dG9mZiBvZiAkMS41KklRUiQgYmVsb3cgdGhlIGZpcnN0IGFuZCBhYm92ZSB0aGUgdGhpcmQgcXVhcnRpbGUuDQoNCmBgYHtyIExlbmd0aCBvZiBTdGF5IDMsIGluY2x1ZGU9RkFMU0V9DQpkZW5zUGxvdCA8LSBzZWxlY3QoTE9TVGFiLCBkaXNjaGFyZ2VEYXRlLCBkYXRlT2ZBZG1pc3Npb24sIExPUykgJT4lDQogIGZpbHRlcihMT1MgPj0gMCkgJT4lDQogIGZpbHRlcighb3V0bGllclRlc3QoTE9TLCBMT1NTdW1tYXJ5KSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGRpc2NoYXJnZURhdGUsIHkgPSBMT1MpKSArIGdlb21faGV4KGJpbnMgPSAyMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDAuNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIikgKyBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAiRCIpICsNCiAgbGFicyh5ID0gIkxlbmd0aCBvZiBTdGF5IiwNCiAgICAgICB4ID0gIkRhdGUiLA0KICAgICAgIGZpbGwgPSAiQ291bnQiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCg0KcGxvdF9nZygNCiAgZGVuc1Bsb3QsDQogIG11bHRpY29yZSA9IFRSVUUsDQogIHdpZHRoID0gNywNCiAgaGVpZ2h0ID0gNywNCiAgd2luZG93c2l6ZSA9IGMoMTQwMCw4NjYpLA0KICBvZmZzZXRfZWRnZXMgPSBUUlVFLA0KICBzY2FsZSA9IDMwMCwNCiAgc3VuYW5nbGU9MjI1DQogICkNCnJlbmRlcl9jYW1lcmEoDQogIGZvdiA9IDcwLA0KICB6b29tID0gMC42NSwNCiAgcGhpID0gMzAsDQogIHRoZXRhID0gMzMwDQogICkNCg0KIyBkZW5zM2QgPC0gc2NlbmUzZCgpDQojIHJnbC5jbG9zZSgpDQojIHJnbHdpZGdldChkZW5zM2QpDQoNCmRlbnNQbG90IDwtIHNlbGVjdChMT1NUYWIsIGRpc2NoYXJnZURhdGUsIGRhdGVPZkFkbWlzc2lvbiwgTE9TKSAlPiUNCiAgZmlsdGVyKExPUyA+PSAwKSAlPiUNCiAgZmlsdGVyKCFvdXRsaWVyVGVzdChMT1MsIExPU1N1bW1hcnkpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gZGlzY2hhcmdlRGF0ZSwgeSA9IExPUykpICsgZ2VvbV9oZXgoYmlucyA9IDIwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMC41LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siKSArIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJEIikgKw0KICBsYWJzKHRpdGxlID0gIkxlbmd0aCBvZiBTdGF5IHBlciBQYXRpZW50IHdpdGhvdXQgT3V0bGllcnMiLA0KICAgICAgIHkgPSAiTGVuZ3RoIG9mIFN0YXkiLA0KICAgICAgIHggPSAiRGF0ZSIsDQogICAgICAgZmlsbCA9ICJDb3VudCIpICsgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gImJsYWNrIikNCiAgKQ0KZGVuc19oZXggPC0gZ2dwbG90bHkoZGVuc1Bsb3QpDQoNCg0KYGBgDQojIyMgUGF0aWVudCBsZW5ndGggb2Ygc3RheSBkZW5zaXR5IHZpc3VhbGl6YXRpb24NCjNEIFBsb3QNCmBgYHtyIExlbmd0aCBvZiBTdGF5IDMgLSAzRCBQbG90LCBlY2hvPUZBTFNFLCBjYWNoZT1UUlVFLCBmaWcuYWxpZ24gPSAiY2VudGVyIn0NCnJlbmRlcl9zbmFwc2hvdChjbGVhciA9IFRSVUUpDQpyZ2wuY2xvc2UoKQ0KYGBgDQoyRCBQbG90DQpgYGB7ciBMZW5ndGggb2YgU3RheSAzIC0gMkQgUGxvdCwgZWNobz1GQUxTRSwgY2FjaGU9VFJVRSwgZmlnLmFsaWduID0gImNlbnRlciIsIGZpZy5oZWlnaHQ9IDV9DQpkZW5zX2hleA0KYGBgDQoNCmBgYHtyIExlbmd0aCBvZiBTdGF5IDQsIGVjaG89RkFMU0V9DQpzdXBwcmVzc01lc3NhZ2VzKA0KTE9TQWdlIDwtIGxlZnRfam9pbihMT1NUYWIsIEVEKSAlPiUNCiAgZmlsdGVyKExPUyA+PSAwKSAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUoQWdlX0dyb3VwID0gYWdlX2dyb3VwcyhhZ2UpKQ0KKQ0KDQpMT1NBZ2UkQWdlX0dyb3VwIDwtDQogIG9yZGVyZWQoTE9TQWdlJEFnZV9Hcm91cCwNCiAgICAgICAgICBsZXZlbHMgPSBhZ2VfbGlzdCkNCg0KZ3JvdXBfTE9TIDwtIGdncGxvdChMT1NBZ2UsIGFlcyh4ID0gQWdlX0dyb3VwLCB5ID0gTE9TKSkNCg0KZ3JvdXBfTE9TX0JveCA8LSBncm91cF9MT1MgKyBnZW9tX2JveHBsb3QoZmlsbCA9ICdkb2RnZXJibHVlJykgKw0KICBsYWJzKHRpdGxlID0gIkxlbmd0aCBvZiBTdGF5IHBlciBQYXRpZW50IEFnZSBHcm91cCIsDQogICAgICAgeSA9ICJMZW5ndGggb2YgU3RheSAoRGF5cykiLA0KICAgICAgIHggPSAiQWdlIEdyb3VwIikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMzApKSArIA0KICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSAiYmxhY2siKSkNCg0KZ3JvdXBfTE9TX0RlbnNpdHkgPC0NCiAgZ3JvdXBfTE9TICsgZ2VvbV92aW9saW4oZmlsbCA9ICdkb2RnZXJibHVlJywgdHJpbSA9IEZBTFNFKSArIHN0YXRfc3VtbWFyeSgNCiAgICBmdW4ueSA9IG1lZGlhbiwNCiAgICBnZW9tID0gInBvaW50IiwNCiAgICBzaXplID0gMSwNCiAgICBjb2xvciA9ICJibGFjayINCiAgKSArDQogIGxhYnModGl0bGUgPSAiTGVuZ3RoIG9mIFN0YXkgcGVyIFBhdGllbnQgQWdlIEdyb3VwIiwNCiAgICAgICB5ID0gIkxlbmd0aCBvZiBTdGF5IChEYXlzKSIsDQogICAgICAgeCA9ICJBZ2UgR3JvdXAiKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCA1MCkpICsgDQogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJibGFjayIpKQ0KDQphZ2VfTE9TIDwtIGdncGxvdChMT1NBZ2UsIGFlcyh4ID0gYWdlLCB5ID0gTE9TKSkgKyBnZW9tX3Ntb290aCgpICsNCiAgbGFicyh0aXRsZSA9ICJMZW5ndGggb2YgU3RheSB2cyBQYXRpZW50IEFnZSIsDQogICAgICAgeSA9ICJMZW5ndGggb2YgU3RheSAoRGF5cykiLA0KICAgICAgIHggPSAiQWdlIikgKyBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMTIuNSksIHhsaW0gPSBjKDAsIDEwMCkpICsgDQogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJibGFjayIpDQogICAgICAgICkNCmBgYA0KIyMjIExlbmd0aCBvZiBTdGF5IGJ5IEFnZSBHcm91cA0KYHIgZ2dwbG90bHkoZ3JvdXBfTE9TX0JveClgDQpgciBnZ3Bsb3RseShncm91cF9MT1NfRGVuc2l0eSlgDQpgciBnZ3Bsb3RseShhZ2VfTE9TKWANCg0KYGBge3IgSUNELCBlY2hvPUZBTFNFfQ0Kc3VwcHJlc3NNZXNzYWdlcygNCkFnZUlDRCA8LSBsZWZ0X2pvaW4oeCA9IExPU0FnZSwgeSA9IERpYWdub3NpcykgJT4lDQogIGxlZnRfam9pbih4ID0gLiwgeSA9IElDRCkgJT4lDQogIGxlZnRfam9pbih4ID0gLiwgeSA9IElDREJsb2NrKSAlPiUNCiAgbGVmdF9qb2luKHggPSAuLCB5ID0gSUNEQ2hhcCkNCikNCg0KQWdlSUNEJElDRF9DaGFwdGVyX1Nob3J0IDwtDQogIG9yZGVyZWQoQWdlSUNEJElDRF9DaGFwdGVyX1Nob3J0LCBsZXZlbHMgPSBJQ0RDaGFwJElDRF9DaGFwdGVyX1Nob3J0KQ0KDQpDaGFwX0NJIDwtIE11bHRpX0NJKEFnZUlDRCRJQ0RfQ2hhcHRlcl9TaG9ydCkgJT4lDQogIHJlbmFtZSgiSUNEIENoYXB0ZXIiID0gRmllbGRzKQ0KQ2hhcF9UYWIgPC0gZm9ybWF0dGFibGUoDQogIENoYXBfQ0ksDQogIGFsaWduID0gYygibCIsIHJlcCgiciIsIE5DT0woQ2hhcF9DSSkgLSAxKSksDQogIGxpc3QoDQogICAgIklDRCBDaGFwdGVyIiA9IGZvcm1hdHRlcigic3BhbiIsIHN0eWxlID0gfiBzdHlsZSgNCiAgICAgIGNvbG9yID0gIkdyZXkiLCBmb250LndlaWdodCA9ICJib2xkIg0KICAgICkpLA0KICAgICJQZXJjZW50YWdlICglKSIgPSBjb2xvcl90aWxlKGdyZWVuX21pbiwgZ3JlZW5fbWF4KQ0KICApDQopDQoNCiNGdWxsIElDRCBDaGFwdGVyIEJyZWFrZG93bg0KRnVsbF9JQ0RfSGlzdG8gPC0NCiAgZ2dwbG90KEFnZUlDRCwgYWVzKHggPSBJQ0RfQ2hhcHRlcl9TaG9ydCkpICsgZ2VvbV9iYXIoZmlsbCA9ICdyZWQnKSArIGdlb21fdGV4dCgNCiAgICBzdGF0ID0gJ2NvdW50JywNCiAgICBhZXMobGFiZWwgPSAuLmNvdW50Li4pLA0KICAgIHZqdXN0ID0gLTAuMywNCiAgICBzaXplID0gMy41DQogICkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gcGFzdGUoIklDRCBDaGFwdGVyIEJyZWFrZG93biAobiA9ICIsIG5yb3coQWdlSUNEKSwgIikiLCBzZXAgPSAiIiksDQogICAgeSA9ICJDb3VudCIsDQogICAgeCA9ICJJQ0QgQ2hhcHRlciINCiAgKSArIHRoZW1lKA0KICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksDQogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3VyID0gImJsYWNrIikNCiAgKQ0KDQpGdWxsX0lDRF9DaGFwIDwtIGdncGxvdChBZ2VJQ0QsIGFlcygNCiAgeCA9IElDRF9DaGFwdGVyX1Nob3J0LA0KICB5ID0gTE9TDQopKQ0KDQpGdWxsX0lDRF9Cb3ggPC0gRnVsbF9JQ0RfQ2hhcCArIGdlb21fYm94cGxvdChmaWxsID0gJ2RvZGdlcmJsdWUnKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiTGVuZ3RoIG9mIFN0YXkgcGVyIElDRCBDaGFwdGVyIiwNCiAgICBzdWJ0aXRsZSA9ICJBcnJhbmdlZCBieSBtZWRpYW4iLA0KICAgIHkgPSAiTGVuZ3RoIG9mIFN0YXkgKERheXMpIiwNCiAgICB4ID0gIklDRCBDaGFwdGVyIg0KICApICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDQwKSkgKyB0aGVtZSgNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLA0KICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJibGFjayIpDQogICkNCg0KRnVsbF9JQ0RfRGVuc2l0eSA8LQ0KICBGdWxsX0lDRF9DaGFwICArIGdlb21fdmlvbGluKGZpbGwgPSAnZG9kZ2VyYmx1ZScsIHRyaW0gPSBGQUxTRSkgKyBzdGF0X3N1bW1hcnkoDQogICAgZnVuLnkgPSBtZWRpYW4sDQogICAgZ2VvbSA9ICJwb2ludCIsDQogICAgc2l6ZSA9IDEsDQogICAgY29sb3IgPSAiYmxhY2siDQogICkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkxlbmd0aCBvZiBTdGF5IHBlciBJQ0QgQ2hhcHRlciIsDQogICAgc3VidGl0bGUgPSAiQXJyYW5nZWQgYnkgbWVkaWFuIiwNCiAgICB5ID0gIkxlbmd0aCBvZiBTdGF5IChEYXlzKSIsDQogICAgeCA9ICJJQ0QgQ2hhcHRlciINCiAgKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCA0MCkpICsgdGhlbWUoDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwNCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSAiYmxhY2siKQ0KICApDQoNCiNUb3AgVGVuIEJyZWFrZG93bg0KdG9wX3Rlbl9DaGFwIDwtIEFnZUlDRCAlPiUNCiAgc2VsZWN0KElDRF9DaGFwdGVyX1Nob3J0KSAlPiUNCiAgdGFibGUoKSAlPiUNCiAgYXMuZGF0YS5mcmFtZSgpICU+JQ0KICBhcnJhbmdlKGRlc2MoRnJlcSkpICU+JQ0KICB0b3BfbiguLCAxMCwgRnJlcSkgJT4lDQogIHNlbGVjdCgiLiIpDQoNCnRvcF90ZW5fQWdlSUNEIDwtIEFnZUlDRCAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBmaWx0ZXIoSUNEX0NoYXB0ZXJfU2hvcnQgJWluJSB0b3BfdGVuX0NoYXAkLikNCg0KVG9wX0NoYXBfQmFyIDwtDQogIGdncGxvdCh0b3BfdGVuX0FnZUlDRCwgYWVzKHggPSBmY3RfcmVvcmRlcihJQ0RfQ2hhcHRlcl9TaG9ydCwgTE9TLCAuZnVuID0gbWVkaWFuLCAuZGVzYyA9IFRSVUUpKSkgKyBnZW9tX2JhcihmaWxsID0gJ3JlZCcpICsgZ2VvbV90ZXh0KA0KICAgIHN0YXQgPSAnY291bnQnLA0KICAgIGFlcyhsYWJlbCA9IC4uY291bnQuLiksDQogICAgdmp1c3QgPSAtMC4zLA0KICAgIHNpemUgPSAzLjUNCiAgKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSBwYXN0ZSgNCiAgICAgICJUb3AgMTAgSUNEIENoYXB0ZXIgQnJlYWtkb3duIChuID0gIiwNCiAgICAgIG5yb3codG9wX3Rlbl9BZ2VJQ0QpLA0KICAgICAgIikiLA0KICAgICAgc2VwID0gIiINCiAgICApLA0KICAgIHkgPSAiQ291bnQiLA0KICAgIHggPSAiSUNEIENoYXB0ZXIiDQogICkgKyB0aGVtZSgNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLA0KICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJibGFjayIpDQogICkNCg0KVG9wX0lDRFBsb3QgPC0NCiAgZ2dwbG90KHRvcF90ZW5fQWdlSUNELCBhZXMoDQogICAgeCA9IGZjdF9yZW9yZGVyKElDRF9DaGFwdGVyX1Nob3J0LCBMT1MsIC5mdW4gPSBtZWRpYW4sIC5kZXNjID0gVFJVRSksDQogICAgeSA9IExPUw0KICApKQ0KDQpUb3BfSUNEX0JveCA8LSBUb3BfSUNEUGxvdCArIGdlb21fYm94cGxvdChmaWxsID0gJ2RvZGdlcmJsdWUnKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiTGVuZ3RoIG9mIHN0YXkgcGVyIElDRCBjaGFwdGVyIiwNCiAgICBzdWJ0aXRsZSA9ICJCb3hwbG90cyBvZiB0aGUgMTAgbW9zdCBjb21tb24gY2hhcHRlcnMgYXJyYW5nZWQgYnkgbWVkaWFuIiwNCiAgICB5ID0gIkxlbmd0aCBvZiBzdGF5IChEYXlzKSIsDQogICAgeCA9ICJJQ0QgY2hhcHRlciINCiAgKSArIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCA0MCkpICsgdGhlbWUoDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwNCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSAiYmxhY2siKQ0KICApDQoNClRvcF9JQ0RfVmlvbGluIDwtDQogIFRvcF9JQ0RQbG90ICsgZ2VvbV92aW9saW4oZmlsbCA9ICdkb2RnZXJibHVlJywgdHJpbSA9IEZBTFNFKSArIHN0YXRfc3VtbWFyeSgNCiAgICBmdW4ueSA9IG1lZGlhbiwNCiAgICBnZW9tID0gInBvaW50IiwNCiAgICBzaXplID0gMiwNCiAgICBjb2xvciA9ICJibGFjayINCiAgKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiTGVuZ3RoIG9mIHN0YXkgcGVyIElDRCBjaGFwdGVyIiwNCiAgICBzdWJ0aXRsZSA9ICJEZW5zaXR5IHBsb3RzIG9mIHRoZSAxMCBtb3N0IGNvbW1vbiBjaGFwdGVycyBhcnJhbmdlZCBieSBtZWRpYW4iLA0KICAgIHkgPSAiTGVuZ3RoIG9mIHN0YXkgKERheXMpIiwNCiAgICB4ID0gIklDRCBjaGFwdGVyIg0KICApICsgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDQwKSkgKyB0aGVtZSgNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLA0KICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJibGFjayIpDQogICkNCmBgYA0KDQojIyBJQ0QgQW5hbHlzaXMNCmByIENoYXBfVGFiYA0KDQojIyMgRnVsbCBEYXRhc2V0DQpgciBnZ3Bsb3RseShGdWxsX0lDRF9IaXN0bylgDQpgciBnZ3Bsb3RseShGdWxsX0lDRF9Cb3gpYA0KYHIgZ2dwbG90bHkoRnVsbF9JQ0RfRGVuc2l0eSlgDQoNCiMjIyBUb3AgVGVuIENvZGVzDQpgciBnZ3Bsb3RseShUb3BfQ2hhcF9CYXIpYA0KYHIgZ2dwbG90bHkoVG9wX0lDRF9Cb3gpYA0KYHIgZ2dwbG90bHkoVG9wX0lDRF9WaW9saW4pYA0KDQojIyMgRGVtb2dyYXBoaWMgSUNEIEZsb3cNCmBgYHtyIElDRDIsIGVjaG89RkFMU0V9DQpNZXJnZWRNb2QgPC0gDQogIE1lcmdlZElDRCAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBtdXRhdGUoQWdlX0dyb3VwID0gYWdlX2dyb3VwcyhhZ2UpKSAlPiUNCiAgZmlsdGVyKGdlbmRlciAhPSAiT3RoZXIiKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBncm91cF9ieShnZW5kZXIsIGV0aG5pY2l0eSwgQWdlX0dyb3VwLCBJQ0RfVGl0bGUpICU+JQ0KICBjb3VudCgpDQoNCk1lcmdlZE1vZCRBZ2VfR3JvdXAgPC0NCiAgb3JkZXJlZChNZXJnZWRNb2QkQWdlX0dyb3VwLA0KICAgICAgICAgIGxldmVscyA9IGFnZV9saXN0KQ0KDQpBbGx1dl9Db2RlIDwtIE1lcmdlZE1vZCAlPiUNCiAgZmlsdGVyKG4gPiAxMDApICU+JQ0KICBnZ3Bsb3QoYWVzKA0KICAgIGF4aXMxID0gZ2VuZGVyLA0KICAgIGF4aXMyID0gQWdlX0dyb3VwLA0KICAgIGF4aXMzID0gSUNEX1RpdGxlLA0KICAgIHkgPSBuDQogICkpICsgZ2VvbV9hbGx1dml1bShhZXMoZmlsbCA9IGdlbmRlciwgY29sb3VyID0gZ2VuZGVyKSkgKyBnZW9tX3N0cmF0dW0oKSArDQogIGdlb21fdGV4dCgNCiAgICBzdGF0ID0gInN0cmF0dW0iLA0KICAgIGxhYmVsLnN0cmF0YSA9IFRSVUUsDQogICAgc2l6ZSA9IDMsDQogICAgbGFiZWwgPSBjKA0KICAgICAgIk1hbGUiLA0KICAgICAgIkZlbWFsZSIsDQogICAgICAiQWdlZCIsDQogICAgICAiTWlkZGxlIEFnZWQiLA0KICAgICAgIkFkdWx0IiwNCiAgICAgICJBZG9sZXNjZW50IiwNCiAgICAgICJTa2luICYgU3ViY3V0IEluZmVjdGlvbnMiLA0KICAgICAgIkdhbGxibGFkZGVyLFxuQmlsaWFyeSBUcmFjdFxuJiBQYW5jcmVhcyIsDQogICAgICAiT3RoZXIgSW50ZXN0aW5hbCIsDQogICAgICAiSGVybmlhIiwNCiAgICAgICJBcHBlbmRpeCIsDQogICAgICAiT2Vzb3BoYWd1cyxcblN0b21hY2ggJiBEZW9kZW51bSIsDQogICAgICAiQnJlYXN0IE5lb3BsYXNtIiwNCiAgICAgICJEaWdlc3RpdmVcbk5lb3BsYXNtIiwNCiAgICAgICJOL0EiDQogICAgKQ0KICApICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJTZXgiLCAiQWdlIEdyb3VwIiwgIklDRCBCbG9jayIpLA0KICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMC4xLCAwLjEpKSArIHRoZW1lX21pbmltYWwoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gcGFzdGUoIkdlbmVyYWwgSUNEMTAgQ29kZSBCcmVha2Rvd24gKG49IiwgbnJvdyhFRCksICIpIiwgc2VwID0gIiIpLA0KICAgIHN1YnRpdGxlID0gIlN0cmF0aWZpZWQgYnkgU2V4LCBBZ2UgR3JvdXAgJiBJQ0QgQ29kZSIsDQogICAgeSA9ICJGcmVxdWVuY3kiDQogICkNCg0KTWVyZ2VkTW9kMiA8LQ0KICBNZXJnZWRJQ0QgJT4lICNHZW5lcmF0ZXMgTWVyZ2VkIExpc3Qgb2YgUGF0aWVudHMgb24gU2V4LCBBZ2UgR3JvdXAgJiBJQ0QgQ2hhcHRlcg0KICByb3d3aXNlKCkgJT4lDQogIG11dGF0ZShBZ2VfR3JvdXAgPSBhZ2VfZ3JvdXBzKGFnZSkpICU+JQ0KICBmaWx0ZXIoZ2VuZGVyICE9ICJPdGhlciIpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIGdyb3VwX2J5KGdlbmRlciwgZXRobmljaXR5LCBBZ2VfR3JvdXAsIElDRF9DaGFwdGVyKSAlPiUNCiAgY291bnQoKQ0KDQpNZXJnZWRNb2QyJEFnZV9Hcm91cCA8LQ0KICBvcmRlcmVkKA0KICAgIE1lcmdlZE1vZDIkQWdlX0dyb3VwLA0KICAgIGxldmVscyA9IGFnZV9saXN0DQogICkNCg0KQWxsdXZfQ2hhcCA8LSBNZXJnZWRNb2QyICU+JQ0KICBmaWx0ZXIobiA+IDEwMCkgJT4lDQogIGdncGxvdChhZXMoDQogICAgYXhpczEgPSBnZW5kZXIsDQogICAgYXhpczIgPSBBZ2VfR3JvdXAsDQogICAgYXhpczMgPSBJQ0RfQ2hhcHRlciwNCiAgICB5ID0gbg0KICApKSArIGdlb21fYWxsdXZpdW0oYWVzKGZpbGwgPSBnZW5kZXIsIGNvbG91ciA9IGdlbmRlcikpICsgZ2VvbV9zdHJhdHVtKCkgKw0KICBnZW9tX3RleHQoDQogICAgc3RhdCA9ICJzdHJhdHVtIiwNCiAgICBsYWJlbC5zdHJhdGEgPSBUUlVFLA0KICAgIHNpemUgPSA0LA0KICAgIGxhYmVsID0gYygNCiAgICAgICJNYWxlIiwNCiAgICAgICJGZW1hbGUiLA0KICAgICAgIkFnZWQiLA0KICAgICAgIk1pZGRsZSBBZ2VkIiwNCiAgICAgICJBZHVsdCIsDQogICAgICAiWW91bmcgQWR1bHQiLA0KICAgICAgIkFkb2xlc2NlbnQiLA0KICAgICAgIkdlbml0b3VyaW5hcnkgU3lzdGVtIiwNCiAgICAgICJTa2luICYgU3ViY3V0IFRpc3N1ZSIsDQogICAgICAiRGlnZXN0aXZlIFN5c3RlbSIsDQogICAgICAiQ2lyY3VsYXRvcnkgU3lzdGVtIiwNCiAgICAgICJOZW9wbGFzbXMiLA0KICAgICAgIk4vQSINCiAgICApDQogICkgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIlNleCIsICJBZ2UgR3JvdXAiLCAiSUNEIENoYXB0ZXIiKSwNCiAgICAgICAgICAgICAgICAgICBleHBhbmQgPSBjKDAuMSwgMC4xKSkgKyB0aGVtZV9taW5pbWFsKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIikpICsNCiAgbGFicygNCiAgICB0aXRsZSA9IHBhc3RlKCJHZW5lcmFsIElDRDEwIENoYXB0ZXIgQnJlYWtkb3duIChuPSIsIG5yb3coRUQpLCAiKSIsIHNlcCA9ICIiKSwNCiAgICBzdWJ0aXRsZSA9ICJTdHJhdGlmaWVkIGJ5IFNleCwgQWdlIEdyb3VwICYgSUNEIENoYXB0ZXIiLA0KICAgIHkgPSAiRnJlcXVlbmN5Ig0KICApDQpgYGANCg0KIyMjIyBJQ0QgQ2hhcHRlciBTYW5rZXkgRmxvdw0KYGBge3IgSUNEMiAtIEFsbHV2MSwgZWNobz1GQUxTRSwgZmlnLmhlaWdodCA9IDEwLCBmaWcud2lkdGggPSAxNX0NCkFsbHV2X0NoYXANCmBgYA0KDQojIyMjIElDRCBDb2RlIFNhbmtleSBGbG93DQpgYGB7ciBJQ0QyIC0gQWxsdXYyLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0ID0gMTAsIGZpZy53aWR0aCA9IDE1fQ0KQWxsdXZfQ29kZQ0KYGBgDQpgYGB7ciBMT1MsIGluY2x1ZGU9RkFMU0V9DQoNCkhpc3RvX0NvdW50IDwtIHNlcGFyYXRlX3Jvd3MoSGlzdG9sb2d5LCA0ICwgc2VwID0gIi8iKSAlPiUNCiAgc2VwYXJhdGVfcm93cyg0ICwgc2VwID0gImFuZCIpICU+JQ0KICBzZXBhcmF0ZV9yb3dzKDQgLCBzZXAgPSAiQU5EIikgJT4lDQogIHNlcGFyYXRlX3Jvd3MoNCAsIHNlcCA9ICImIikgJT4lDQogIHNlcGFyYXRlX3Jvd3MoNCAsIHNlcCA9ICIsIikgJT4lDQogIHNlcGFyYXRlX3Jvd3MoNCAsIHNlcCA9ICIgKyAiKSAlPiUNCiAgc2VwYXJhdGVfcm93cyg0ICwgc2VwID0gIjsiKSAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBmaWx0ZXIoc3BlY2ltZW5OdW1iZXIgIT0gIm5pbCIgJiYgc3BlY2ltZW5OdW1iZXIgIT0gIk5pbCIgJiYgIWlzLm51bGwoc3BlY2ltZW5OdW1iZXIpICYmIA0KICAgICAgICAgICAhaXMubmEoc3BlY2ltZW5OdW1iZXIpICYmIHNwZWNpbWVuTnVtYmVyICE9ICIiICYmIHNwZWNpbWVuTnVtYmVyICE9ICI/PyIgJiYgc3BlY2ltZW5OdW1iZXIgIT0gIj8iKSAgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgZ3JvdXBfYnkocHJvY2VkdXJlSWQpICU+JQ0KICBjb3VudCgpICU+JQ0KICByZW5hbWUoIkhpc3RvX24iID0gbikNCg0KTWVkaWNhdGlvbl9Db3VudCA8LSBNZWRpY2F0aW9uICU+JQ0KICBncm91cF9ieShkaXNjaGFyZ2VSZWNvcmRJZCkgJT4lDQogIGNvdW50KCkgJT4lDQogIHJlbmFtZSgiRHJ1Z19uIiA9IG4pDQoNCkNvbXBsaWNhdGlvbl9Db3VudCA8LSBDb21wbGljYXRpb25zICU+JQ0KICBncm91cF9ieShkaXNjaGFyZ2VSZWNvcmRJZCkgJT4lDQogIGNvdW50KCkgJT4lDQogIHJlbmFtZSgiQ29tcGxpY2F0aW9uX24iID0gbikNCg0KUHJvY2VkdXJlX0NvdW50IDwtIFByb2NlZHVyZSAlPiUNCiAgcm93d2lzZSgpICU+JQ0KICBsZWZ0X2pvaW4oLiwgSGlzdG9fQ291bnQpICU+JQ0KICBtdXRhdGUoSGlzdG9fbiA9IG51bGxfdG9fbmlsKEhpc3RvX24pKSAgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgZ3JvdXBfYnkoZGlzY2hhcmdlUmVjb3JkSWQsIEhpc3RvX24pICU+JQ0KICBjb3VudCgpICU+JQ0KICByZW5hbWUoIlByb2NlZHVyZV9uIiA9IG4pDQoNClJhZGlvbG9neV9Db3VudCA8LSBSYWRpb2xvZ3kgJT4lDQogIGdyb3VwX2J5KGRpc2NoYXJnZVJlY29yZElkKSAlPiUNCiAgY291bnQoKSAlPiUNCiAgcmVuYW1lKCJSYWRpb2xvZ3lfbiIgPSBuKQ0KDQpDb21wbGljYXRpb25fR3JhZGUgPC0gQ29tcGxpY2F0aW9ucyAlPiUNCiAgc2VsZWN0KGRpc2NoYXJnZVJlY29yZElkLCBHcmFkZSkNCiNDYW4gUmVwbGFjZSBBZ2VJQ0Qgd2l0aCBMT1NBZ2UNCiNHZW5lcmF0ZXMgU3VtbWFyaXNlZCBEaXNjaGFyZ2UgU3VtbWFyeSB3aXRoIE1lZGljYXRpb24sIFByb2NlZHVyZXMgJiBJbnZlc3RpZ2F0aW9ucw0KTWVyZ2VkX01lZCA8LSBsZWZ0X2pvaW4oQWdlSUNELCBNZWRpY2F0aW9uX0NvdW50KSAlPiUNCiAgbXV0YXRlKERydWdfbiA9IG51bGxfdG9fbmlsKERydWdfbikpICU+JQ0KICBsZWZ0X2pvaW4oLiwgUHJvY2VkdXJlX0NvdW50KSAlPiUNCiAgbXV0YXRlKFByb2NlZHVyZV9uID0gbnVsbF90b19uaWwoUHJvY2VkdXJlX24pKSAlPiUNCiAgbXV0YXRlKEhpc3RvX24gPSBudWxsX3RvX25pbChIaXN0b19uKSkgJT4lDQogIGxlZnRfam9pbiguLCBDb21wbGljYXRpb25fQ291bnQpICU+JQ0KICBtdXRhdGUoQ29tcGxpY2F0aW9uX24gPSBudWxsX3RvX25pbChDb21wbGljYXRpb25fbikpICU+JQ0KICBsZWZ0X2pvaW4oLiwgUmFkaW9sb2d5X0NvdW50KSAlPiUNCiAgbXV0YXRlKFJhZGlvbG9neV9uID0gbnVsbF90b19uaWwoUmFkaW9sb2d5X24pKSAlPiUNCiAgc2VsZWN0KGxldmVsT2ZDYXJlLCBkaXNjaGFyZ2VUeXBlLCBkaXNjaGFyZ2VXYXJkLCBNb250aCwgWWVhciwgTE9TLCBnZW5kZXIsIGV0aG5pY2l0eSwgYWdlLCBBZ2VfR3JvdXAsIA0KICAgICAgICAgSUNEX0NoYXB0ZXJfU2hvcnQsIElDRF9UaXRsZSwgSUNEX0Rlc2NyaXB0aW9uLCBEcnVnX24sIFByb2NlZHVyZV9uLCBIaXN0b19uLCBSYWRpb2xvZ3lfbiwgQ29tcGxpY2F0aW9uX24pICU+JQ0KICBtdXRhdGUoTE9TX091dGNvbWUgPSBpZmVsc2UoTE9TID4gNSwgMSwgMCksDQogICAgICAgICBEcnVnX3JhdGUgPSBEcnVnX24gLyBMT1MsDQogICAgICAgICBQcm9jZWR1cmVfcmF0ZSA9IFByb2NlZHVyZV9uIC8gTE9TLA0KICAgICAgICAgSGlzdG9fcmF0ZSA9IEhpc3RvX24gLyBMT1MsDQogICAgICAgICBSYWRpb2xvZ3lfcmF0ZSA9IFJhZGlvbG9neV9uIC8gTE9TLA0KICAgICAgICAgQ29tcGxpY2F0aW9uX3JhdGUgPSBDb21wbGljYXRpb25fbiAvIExPUykNCg0KZGVjbGFyX01lcmdfdHlwZSA8LSBmdW5jdGlvbigpIHsNCiAgTWVyZ2VkX01lZCRsZXZlbE9mQ2FyZSA8PC0gZmFjdG9yKE1lcmdlZF9NZWQkbGV2ZWxPZkNhcmUsIG9yZGVyZWQgPSBGQUxTRSkNCiAgTWVyZ2VkX01lZCRkaXNjaGFyZ2VUeXBlIDw8LSBmYWN0b3IoTWVyZ2VkX01lZCRkaXNjaGFyZ2VUeXBlLCBvcmRlcmVkID0gRkFMU0UpDQogIE1lcmdlZF9NZWQkZGlzY2hhcmdlV2FyZCA8PC0gZmFjdG9yKE1lcmdlZF9NZWQkZGlzY2hhcmdlV2FyZCwgb3JkZXJlZCA9IEZBTFNFKQ0KICBNZXJnZWRfTWVkJGdlbmRlciA8PC0gZmFjdG9yKE1lcmdlZF9NZWQkZ2VuZGVyLCBvcmRlcmVkID0gRkFMU0UpDQogIE1lcmdlZF9NZWQkZXRobmljaXR5IDw8LSBmYWN0b3IoTWVyZ2VkX01lZCRldGhuaWNpdHksIG9yZGVyZWQgPSBGQUxTRSkNCiAgTWVyZ2VkX01lZCRBZ2VfR3JvdXAgPDwtIGZhY3RvcihNZXJnZWRfTWVkJEFnZV9Hcm91cCwgb3JkZXJlZCA9IEZBTFNFKQ0KICBNZXJnZWRfTWVkJE1vbnRoIDw8LSBmYWN0b3IoTWVyZ2VkX01lZCRNb250aCkNCiAgTWVyZ2VkX01lZCRZZWFyIDw8LSBmYWN0b3IoTWVyZ2VkX01lZCRZZWFyKQ0KICBNZXJnZWRfTWVkJExPU19PdXRjb21lIDw8LSBmYWN0b3IoTWVyZ2VkX01lZCRMT1NfT3V0Y29tZSwgYygwLCAxKSwgb3JkZXJlZCA9IEZBTFNFKQ0KICBNZXJnZWRfTWVkJElDRF9DaGFwdGVyX1Nob3J0IDw8LSBmYWN0b3IoTWVyZ2VkX01lZCRJQ0RfQ2hhcHRlcl9TaG9ydCwgb3JkZXJlZCA9IEZBTFNFKQ0KICBNZXJnZWRfTWVkJElDRF9UaXRsZSA8PC0gZmFjdG9yKE1lcmdlZF9NZWQkSUNEX1RpdGxlLCBvcmRlcmVkID0gRkFMU0UpDQogIE1lcmdlZF9NZWQkSUNEX0Rlc2NyaXB0aW9uIDw8LSBmYWN0b3IoTWVyZ2VkX01lZCRJQ0RfRGVzY3JpcHRpb24sIG9yZGVyZWQgPSBGQUxTRSkNCn0NCg0KZGVjbGFyX01lcmdfdHlwZSgpDQoNCk1lcmdlZF9NZWQkQWdlX0dyb3VwIDwtIG9yZGVyZWQoTWVyZ2VkX01lZCRBZ2VfR3JvdXAsIGFnZV9saXN0KQ0KDQpnZW5kZXJfY3Jvc3MgPC0gY3Jvc3NfdGFiKE1lcmdlZF9NZWQkZ2VuZGVyLCBNZXJnZWRfTWVkJExPU19PdXRjb21lKQ0KZXRobmljaXR5X2Nyb3NzIDwtIGNyb3NzX3RhYihNZXJnZWRfTWVkJGV0aG5pY2l0eSwgTWVyZ2VkX01lZCRMT1NfT3V0Y29tZSkNCkFnZV9Hcm91cF9jcm9zcyA8LSBjcm9zc190YWIoTWVyZ2VkX01lZCRBZ2VfR3JvdXAsIE1lcmdlZF9NZWQkTE9TX091dGNvbWUpDQpkaXNjaGFyZ2VXYXJkX2Nyb3NzIDwtIGNyb3NzX3RhYihNZXJnZWRfTWVkJGRpc2NoYXJnZVdhcmQsIE1lcmdlZF9NZWQkTE9TX091dGNvbWUpDQpkaXNjaGFyZ2VUeXBlX2Nyb3NzIDwtIGNyb3NzX3RhYihNZXJnZWRfTWVkJGRpc2NoYXJnZVR5cGUsIE1lcmdlZF9NZWQkTE9TX091dGNvbWUpDQpJQ0RfQ2hhcHRlcl9TaG9ydF9jcm9zcyA8LSBjcm9zc190YWIoTWVyZ2VkX01lZCRJQ0RfQ2hhcHRlcl9TaG9ydCwgTWVyZ2VkX01lZCRMT1NfT3V0Y29tZSkNCklDRF9UaXRsZV9jcm9zcyA8LSBjcm9zc190YWIoTWVyZ2VkX01lZCRJQ0RfVGl0bGUsIE1lcmdlZF9NZWQkTE9TX091dGNvbWUpDQoNCk1lcmdlZF9NZWQkQWdlX0dyb3VwIDwtIGZhY3RvcihNZXJnZWRfTWVkJEFnZV9Hcm91cCkNCg0KTWVyZ2VkX01lZCA8LSBNZXJnZWRfTWVkICU+JQ0KICBmaWx0ZXIoIWdlbmRlciAlaW4lIGZpbHRlcl9uaWwoTWVyZ2VkX01lZCRnZW5kZXIpLA0KICAgICAgICAgIWV0aG5pY2l0eSAlaW4lIGZpbHRlcl9uaWwoTWVyZ2VkX01lZCRldGhuaWNpdHkpLA0KICAgICAgICAgIUFnZV9Hcm91cCAlaW4lIGZpbHRlcl9uaWwoTWVyZ2VkX01lZCRBZ2VfR3JvdXApLA0KICAgICAgICAgIWRpc2NoYXJnZVdhcmQgJWluJSBmaWx0ZXJfbmlsKE1lcmdlZF9NZWQkZGlzY2hhcmdlV2FyZCksDQogICAgICAgICAhZGlzY2hhcmdlVHlwZSAlaW4lIGZpbHRlcl9uaWwoTWVyZ2VkX01lZCRkaXNjaGFyZ2VUeXBlKSwNCiAgICAgICAgICFJQ0RfQ2hhcHRlcl9TaG9ydCAlaW4lIGZpbHRlcl9uaWwoTWVyZ2VkX01lZCRJQ0RfQ2hhcHRlcl9TaG9ydCksDQogICAgICAgICAhSUNEX1RpdGxlICVpbiUgZmlsdGVyX25pbChNZXJnZWRfTWVkJElDRF9UaXRsZSkpDQoNCmRlY2xhcl9NZXJnX3R5cGUoKQ0KDQpnZW5kZXJfdW5pdmFyIDwtDQogIHVuaXZhcmlhdGVfcmVncmVzc2lvbihNZXJnZWRfTWVkJExPU19PdXRjb21lLCBNZXJnZWRfTWVkJGdlbmRlciwgTWVyZ2VkX01lZCwgY29ycmVsYXRpb24gPSBUUlVFKQ0KDQogIGdlbmRlcl9UYWIgPC0gZ2VuZGVyX3VuaXZhclsxXVtbMV1dDQogIGdlbmRlcl93YWxkIDwtIGdlbmRlcl91bml2YXJbMl1bWzFdXQ0KICBnZW5kZXJfcFZhbCA8LSBnZW5kZXJfdW5pdmFyWzNdW1sxXV0NCiAgZ2VuZGVyX09kZHMgPC0gb2Rkc19tYXRyaXgoZ2VuZGVyX1RhYiwgZ2VuZGVyX3BWYWwpDQogIGdlbmRlcl9EYXRhIDwtIGFzLmRhdGF0YWJsZShnZW5kZXJfT2RkcykNCiAgZ2VuZGVyX3N1bW1hcnkgPC0gZ2VuZGVyX3VuaXZhcls0XVtbMV1dDQogIA0KZXRobmljaXR5X3VuaXZhciA8LQ0KICB1bml2YXJpYXRlX3JlZ3Jlc3Npb24oTWVyZ2VkX01lZCRMT1NfT3V0Y29tZSwgTWVyZ2VkX01lZCRldGhuaWNpdHksIE1lcmdlZF9NZWQsIGNvcnJlbGF0aW9uID0gVFJVRSkNCg0KICBldGhuaWNpdHlfVGFiIDwtIGV0aG5pY2l0eV91bml2YXJbMV1bWzFdXQ0KICBldGhuaWNpdHlfd2FsZCA8LSBldGhuaWNpdHlfdW5pdmFyWzJdW1sxXV0NCiAgZXRobmljaXR5X3BWYWwgPC0gZXRobmljaXR5X3VuaXZhclszXVtbMV1dDQogIGV0aG5pY2l0eV9PZGRzIDwtIG9kZHNfbWF0cml4KGV0aG5pY2l0eV9UYWIsIGV0aG5pY2l0eV9wVmFsKQ0KICBldGhuaWNpdHlfRGF0YSA8LSBhcy5kYXRhdGFibGUoZXRobmljaXR5X09kZHMpDQogIGV0aG5pY2l0eV9zdW1tYXJ5IDwtIGV0aG5pY2l0eV91bml2YXJbNF1bWzFdXQ0KICBldGhuaWNpdHlfc3VtbWFyeQ0KDQpBZ2VfR3JvdXBfdW5pdmFyIDwtDQogIHVuaXZhcmlhdGVfcmVncmVzc2lvbihNZXJnZWRfTWVkJExPU19PdXRjb21lLCBNZXJnZWRfTWVkJEFnZV9Hcm91cCwgTWVyZ2VkX01lZCwgY29ycmVsYXRpb24gPSBUUlVFKQ0KDQogIEFnZV9Hcm91cF9UYWIgPC0gQWdlX0dyb3VwX3VuaXZhclsxXVtbMV1dDQogIEFnZV9Hcm91cF93YWxkIDwtIEFnZV9Hcm91cF91bml2YXJbMl1bWzFdXQ0KICBBZ2VfR3JvdXBfcFZhbCA8LSBBZ2VfR3JvdXBfdW5pdmFyWzNdW1sxXV0NCiAgQWdlX0dyb3VwX09kZHMgPC0gb2Rkc19tYXRyaXgoQWdlX0dyb3VwX1RhYiwgQWdlX0dyb3VwX3BWYWwpDQogIEFnZV9Hcm91cF9EYXRhIDwtIGFzLmRhdGF0YWJsZShBZ2VfR3JvdXBfT2RkcykNCiAgQWdlX0dyb3VwX3N1bW1hcnkgPC0gQWdlX0dyb3VwX3VuaXZhcls0XVtbMV1dDQogIEFnZV9Hcm91cF9zdW1tYXJ5DQogIA0KZGlzY2hhcmdlV2FyZF91bml2YXIgPC0NCiAgdW5pdmFyaWF0ZV9yZWdyZXNzaW9uKE1lcmdlZF9NZWQkTE9TX091dGNvbWUsIE1lcmdlZF9NZWQkZGlzY2hhcmdlV2FyZCwgTWVyZ2VkX01lZCwgY29ycmVsYXRpb24gPSBUUlVFKQ0KDQogIGRpc2NoYXJnZVdhcmRfVGFiIDwtIGRpc2NoYXJnZVdhcmRfdW5pdmFyWzFdW1sxXV0NCiAgZGlzY2hhcmdlV2FyZF93YWxkIDwtIGRpc2NoYXJnZVdhcmRfdW5pdmFyWzJdW1sxXV0NCiAgZGlzY2hhcmdlV2FyZF9wVmFsIDwtIGRpc2NoYXJnZVdhcmRfdW5pdmFyWzNdW1sxXV0NCiAgZGlzY2hhcmdlV2FyZF9PZGRzIDwtIG9kZHNfbWF0cml4KGRpc2NoYXJnZVdhcmRfVGFiLCBkaXNjaGFyZ2VXYXJkX3BWYWwpDQogIGRpc2NoYXJnZVdhcmRfRGF0YSA8LSBhcy5kYXRhdGFibGUoZGlzY2hhcmdlV2FyZF9PZGRzKQ0KICBkaXNjaGFyZ2VXYXJkX3N1bW1hcnkgPC0gZGlzY2hhcmdlV2FyZF91bml2YXJbNF1bWzFdXQ0KDQpkaXNjaGFyZ2VUeXBlX3VuaXZhciA8LQ0KICB1bml2YXJpYXRlX3JlZ3Jlc3Npb24oTWVyZ2VkX01lZCRMT1NfT3V0Y29tZSwgTWVyZ2VkX01lZCRkaXNjaGFyZ2VUeXBlLCBNZXJnZWRfTWVkLCBjb3JyZWxhdGlvbiA9IFRSVUUpDQoNCiAgZGlzY2hhcmdlVHlwZV9UYWIgPC0gZGlzY2hhcmdlVHlwZV91bml2YXJbMV1bWzFdXQ0KICBkaXNjaGFyZ2VUeXBlX3dhbGQgPC0gZGlzY2hhcmdlVHlwZV91bml2YXJbMl1bWzFdXQ0KICBkaXNjaGFyZ2VUeXBlX3BWYWwgPC0gZGlzY2hhcmdlVHlwZV91bml2YXJbM11bWzFdXQ0KICBkaXNjaGFyZ2VUeXBlX09kZHMgPC0gb2Rkc19tYXRyaXgoZGlzY2hhcmdlVHlwZV9UYWIsIGRpc2NoYXJnZVR5cGVfcFZhbCkNCiAgZGlzY2hhcmdlVHlwZV9EYXRhIDwtIGFzLmRhdGF0YWJsZShkaXNjaGFyZ2VUeXBlX09kZHMpDQogIGRpc2NoYXJnZVR5cGVfc3VtbWFyeSA8LSBkaXNjaGFyZ2VUeXBlX3VuaXZhcls0XVtbMV1dDQogIA0KDQpJQ0RfQ2hhcHRlcl9TaG9ydF91bml2YXIgPC0NCiAgdW5pdmFyaWF0ZV9yZWdyZXNzaW9uKE1lcmdlZF9NZWQkTE9TX091dGNvbWUsIE1lcmdlZF9NZWQkSUNEX0NoYXB0ZXJfU2hvcnQsIE1lcmdlZF9NZWQsIGNvcnJlbGF0aW9uID0gVFJVRSwgc3VtbWFyeSA9IEZBTFNFKQ0KDQogIElDRF9DaGFwdGVyX1Nob3J0X1RhYiA8LSBJQ0RfQ2hhcHRlcl9TaG9ydF91bml2YXJbMV1bWzFdXQ0KICBJQ0RfQ2hhcHRlcl9TaG9ydF93YWxkIDwtIElDRF9DaGFwdGVyX1Nob3J0X3VuaXZhclsyXVtbMV1dDQogIElDRF9DaGFwdGVyX1Nob3J0X3BWYWwgPC0gSUNEX0NoYXB0ZXJfU2hvcnRfdW5pdmFyWzNdW1sxXV0NCiAgSUNEX0NoYXB0ZXJfU2hvcnRfT2RkcyA8LSBvZGRzX21hdHJpeChJQ0RfQ2hhcHRlcl9TaG9ydF9UYWIsIElDRF9DaGFwdGVyX1Nob3J0X3BWYWwpDQogIElDRF9DaGFwdGVyX1Nob3J0X0RhdGEgPC0gYXMuZGF0YXRhYmxlKElDRF9DaGFwdGVyX1Nob3J0X09kZHMpDQogIA0KYGBgDQojIyMgTGVuZ3RoIG9mIFN0YXkgUmVncmVzc2lvbiBBbmFseXNpcw0KQW5hbHlzaXMgb2YgcHJlZGljdG9ycyBvZiBhIGxlbmd0aCBvZiBzdGF5IGdyZWF0ZXIgdGhhbiA1IGRheXMgaW4gYSBzdXJnaWNhbCB3YXJkIGF0IGEgV2l0cyBpbnN0aXR1dGlvbi4NCg0KIyMjIyBDcm9zc3RhYmxlIEFuYWx5c2lzDQoNCiMjIyMjIFNleCBDcm9zc3RhYmxlDQpgciBnZW5kZXJfY3Jvc3NgDQoNCiMjIyMjIEV0aG5pY2l0eSBDcm9zc3RhYmxlDQpgciBldGhuaWNpdHlfY3Jvc3NgDQoNCiMjIyMjIEFnZSBHcm91cCBDcm9zc3RhYmxlDQpgciBBZ2VfR3JvdXBfY3Jvc3NgDQoNCiMjIyMjIERpc2NoYXJnZSBXYXJkIENyb3NzdGFibGUNCmByIGRpc2NoYXJnZVdhcmRfY3Jvc3NgDQoNCiMjIyMjIFR5cGUgb2YgRGlzY2hhcmdlIENyb3NzdGFibGUNCmByIGRpc2NoYXJnZVR5cGVfY3Jvc3NgDQoNCiMjIyMjIElDRCBDaGFwdGVyIENyb3NzdGFibGUNCmByIElDRF9DaGFwdGVyX1Nob3J0X2Nyb3NzYA0KDQojIyMjIyBJQ0QgQmxvY2sgVGl0bGUgQ3Jvc3N0YWJsZQ0KYHIgSUNEX1RpdGxlX2Nyb3NzYA0KDQojIyMjIFVuaXZhcmlhdGUgUmVncmVzc2lvbiBBbmFseXNpcw0KDQojIyMjIEdlbmRlciBSZWdyZXNzaW9uDQoqKldhbGQgVGVzdCoqDQpgciBnZW5kZXJfd2FsZGANCioqRml0IFN1bW1hcnkqKg0KYHIgZ2VuZGVyX3N1bW1hcnlgDQoNCiMjIyMjIEdlbmRlciBPZGRzIE1hdHJpeA0KYHIgZ2VuZGVyX0RhdGFgDQoNCiMjIyMjIEV0aG5pY2l0eSBSZWdyZXNzaW9uDQoqKldhbGQgVGVzdCoqDQpgciBldGhuaWNpdHlfd2FsZGAgDQoqKkZpdCBTdW1tYXJ5KioNCmByIGV0aG5pY2l0eV9zdW1tYXJ5YA0KDQojIyMjIyBFdGhuaWNpdHkgT2RkcyBNYXRyaXgNCmByIGV0aG5pY2l0eV9EYXRhYA0KDQojIyMjIyBBZ2UgR3JvdXAgUmVncmVzc2lvbg0KKipXYWxkIFRlc3QqKg0KYHIgQWdlX0dyb3VwX3dhbGRgDQoqKkZpdCBTdW1tYXJ5KioNCmByIEFnZV9Hcm91cF9zdW1tYXJ5YA0KDQojIyMjIyBBZ2UgR3JvdXAgT2RkcyBNYXRyaXgNCmByIEFnZV9Hcm91cF9EYXRhYA0KDQojIyMjIyBEaXNjaGFyZ2UgV2FyZCBSZWdyZXNzaW9uDQoqKldhbGQgVGVzdCoqDQpgciBkaXNjaGFyZ2VXYXJkX3dhbGRgDQoqKkZpdCBTdW1tYXJ5KioNCmByIGRpc2NoYXJnZVdhcmRfc3VtbWFyeWANCg0KIyMjIyMgRGlzY2hhcmdlIFdhcmQgT2RkcyBNYXRyaXgNCmByIGRpc2NoYXJnZVdhcmRfRGF0YWANCg0KIyMjIyMgVHlwZSBvZiBEaXNjaGFyZ2UgUmVncmVzc2lvbg0KKipXYWxkIFRlc3QqKg0KYHIgZGlzY2hhcmdlVHlwZV93YWxkYA0KKipGaXQgU3VtbWFyeSoqDQpgciBkaXNjaGFyZ2VUeXBlX3N1bW1hcnlgDQoNCiMjIyMjIFR5cGUgb2YgRGlzY2hhcmdlIE9kZHMgTWF0cml4DQpgciBkaXNjaGFyZ2VUeXBlX0RhdGFgDQoNCiMjIyMjIElDRCBDaGFwdGVyIFJlZ3Jlc3Npb24NCioqV2FsZCBUZXN0KioNCmByIElDRF9DaGFwdGVyX1Nob3J0X3dhbGRgDQoNCiMjIyMjIElDRCBDaGFwdGVyIE9kZHMgTWF0cml4DQpgciBJQ0RfQ2hhcHRlcl9TaG9ydF9EYXRhYA0KDQo=